在正则表达式中与负面前瞻作斗争

Struggling with negative lookahead in a regex

我谦虚地请求一些关于在正则表达式中使用多个否定前瞻的指导。我目前有一个匹配 2 个正则表达式的字符串。

字符串:Armadale Joe Bloggs 22-333-222 20001 Whitfords 到 Butler

  1. ^Armadale\D+\d{2}-\d{3}-\d{2}\D+2\d{4}\D+$
  2. (Armadale|Fremantle|Butler|Mandurah|Midland|Thornlie)\D+(?![0-9]{2}-[0-9]{3}-[0-9]{2})2[0-9]{4}\D+$

如何修改 Regex 2 使其匹配字符串?

负前瞻 (?![0-9]{2}-[0-9]{3}-[0-9]{2}) 不应该与 22-333-22 匹配吗?

相反,我希望 Regex 2 匹配 22-333-333333-333-2222-22-22?

非常感谢任何帮助。

干杯,

交通

您当前的正则表达式不工作,因为您正在检查正则表达式中当前位置之后的 XX-XXX-XX 子字符串,并且后续字符为 5 位数字,这意味着前瞻将始终为真。删除前瞻,您将匹配 Armadale Joe Bloggs 20001 Whitfords to Butler,而不是 Armadale Joe Bloggs 22-333-222 20001 Whitfords to Butler(您当前的正则表达式不匹配,因为您不允许数字出现在 2 之前):

(Armadale|Fremantle|Butler|Mandurah|Midland|Thornlie)[^\d\n]+2[0-9]{4}[^\d\n]+$

demo 1

如果您想获取任何 XX(X)-XX(X)-XX(X) digit/hyphen 序列,请使用

\b[0-9]{2,3}(?:-[0-9]{2,3}){2}\b

demo 2

您可以组合正则表达式以匹配带替代项的字符串和数字连字符序列:

(Armadale|Fremantle|Butler|Mandurah|Midland|Thornlie)[^\d\n]+2[0-9]{4}[^\d\n]+$|\b[0-9]{2,3}(?:-[0-9]{2,3}){2}\b

demo 3

您的解释表明您的初始样本字符串应该是“Armadale Joe Bloggs 22-333-22 20001 Whitfords to Butler”。 IE。在第三个数字组中只有两个数字。因此,以破折号分隔的数字系列的长度应为 2-3-2。

现在,您希望在新的正则表达式中过滤掉 2-3-2 系列但允许其他系列 -- 2-3-3、3-3-2 或 2-2-2,因为例子。通过添加 (?![0-9]{2}-[0-9]{3}-[0-9]{2}) 前瞻,您接近了,但错过了新的数字序列模式。这是更正后的版本:

^(Armadale|Fremantle|Butler|Mandurah|Midland|Thornlie)\D+(?![0-9]{2}-[0-9]{3}-[0-9]{2}\D+)\d+-\d+-\d+\D+2[0-9]{4}\D+$

(演示:https://regex101.com/r/vI0tY3/1

在上面的正则表达式中,我使用了通用的 \d+-\d+-\d+ 模式,您可能希望对其进行更严格的限制。