【问题标题】:Struggling with negative lookahead in a regex在正则表达式中与负前瞻作斗争
【发布时间】:2015-08-20 04:37:07
【问题描述】:

我谦虚地请求一些关于在正则表达式中使用多个负前瞻的指导。我目前有一个与 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+$

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

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

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

任何帮助将不胜感激。

干杯,

旅行。

【问题讨论】:

  • 如何修改正则表达式 2 使其与字符串不匹配? 正则表达式现在与字符串不匹配 regex101.com/r/dI3xE1/1

标签: regex regex-negation regex-lookarounds


【解决方案1】:

您的解释表明您的初始示例字符串应该是“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+ 模式,您可能希望使其更具限制性。

【讨论】:

  • 谢谢,Dimtry。你能解释一下为什么需要新的数字系列模式 \d+-\d+-\d+ 因为我似乎仍然无法理解它吗?
  • @sdpl.cs:此模式需要匹配 22-333-333、333-333-22、22-22-22 或任何其他以破折号分隔的数字序列。关键是(?![0-9]{2}-[0-9]{3}-[0-9]{2}\D+) 模式并不真正匹配任何东西。它只是限制了前一部分(即(Armadale|Fremantle|Butler|Mandurah|Midland|Thornlie)\D+),因此它后面应该跟着“22-333-22”或类似的东西。
  • 好的,现在说得通了。除此之外,我将如何修改正则表达式,使其足够灵活以适应字符串 'Armadale Sam Bloggs GIBBERISH GIBERISH Whitfords to Butler' 以及基本上不是 \d{2}-\d{3}- 的任何内容\d{2} & 2\d{4} 在“Sam Bloggs and Whitfords to Butler”之间?
  • ^.*?Sam Bloggs.*?Whitfords to Butler$ 表示“Bloggs”和“Whitfords”之间的任何内容 (regex101.com/r/hE0mP1/2) 或 ^.*?Sam Bloggs\s+\S+\s+\S+\s+Whitfords to Butler$ 表示“Bloggs”和“Whitfords”之间的任何两个“单词”(即非空格序列) " (regex101.com/r/sK8vF3/2)
【解决方案2】:

您当前的正则表达式不起作用,因为您正在检查正则表达式中当前位置之后的 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

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

(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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 2011-10-14
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多