我谦卑地请求在正则表达式中使用多个负向前瞻的一些指导。我目前有一个与2个正则表达式匹配的字符串。
字符串: Armadale Joe Bloggs 22-333-222 20001 Whitfords to Butler
^Armadale\D+\d{2}-\d{3}-\d{2}\D+2\d{4}\D+$
(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-333 , 333-333-22 或 22-22-22
任何帮助都将受到高度赞赏。
干杯,
状育苗盘。
答案 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+
模式,您可能希望这种模式更具限制性。