在正则表达式中挣扎于负前瞻

时间:2015-06-05 09:25:55

标签: regex regex-negation regex-lookarounds

我谦卑地请求在正则表达式中使用多个负向前瞻的一些指导。我目前有一个与2个正则表达式匹配的字符串。

字符串: Armadale Joe Bloggs 22-333-222 20001 Whitfords to 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+$
  3. 如何修改Regex 2以使匹配字符串?

    否定前瞻(?![0-9]{2}-[0-9]{3}-[0-9]{2})是否不匹配 22-333-22

    我想改为让Regex 2匹配 22-333-333 333-333-22 22-22-22

    任何帮助都将受到高度赞赏。

    干杯,

    状育苗盘。

2 个答案:

答案 0 :(得分:0)

您当前的正则表达式无效,因为您正在检查正则表达式中当前位置之后的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)数字/连字符序列,请使用

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

请参阅demo 2

您可以组合使用regexp来匹配带有替代字符串和数字连字符序列的字符串:

(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

答案 1 :(得分:0)

您的解释建议您的初始样本字符串应为" Armadale Joe Bloggs 22-333-22 20001 Whitfords to Butler "。即在第三个数字组中只有两位数。因此,以虚线分隔的数字系列的长度应为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+模式,您可能希望这种模式更具限制性。