【问题标题】:Regular Expression Help - Lookahead正则表达式帮助 - 前瞻
【发布时间】:2015-05-07 09:37:47
【问题描述】:

我正在尝试验证一些输入文本(这是一个更大的正则表达式的一部分),基本上我有一个值列表,在这个例子中替换为任意字符,我想匹配它们具有正确的约定..

IE我想匹配AAA001而不是AAA00并匹配ZZ00。

我希望将 AAA 和 ZZ 作为同一组返回,即 IE 组 1,但排除数字..

这就是我要做的事情:

^((AAA|BBC|CCC)(?=\d{3})|(ZZ|XX|YY)(?=\d{2}))$

Debuggex Demo

我在前瞻的概念上哪里出了问题?我试过阅读,但无济于事。

谢谢

编辑:

所以这是一个完整的“混淆”正则表达式的例子。

^(?:OOO)(ABC|DEF)(RR|AA|DD|EE)((?:AAA|BBC|CCC)(?=\d{3})|(?:ZZ|XX|YY)(?=\d{2}))$

Debuggex Demo

所以在我上面的最新示例中.. 我希望第 3 组返回 AAA|BBB|CCC 但不包含数字.. 如果可能,第 4 组可以返回序列号但不重要,它们可以被丢弃..

大卫

【问题讨论】:

  • 如果您将$ 移动到前瞻中,它将起作用。由于前瞻不消耗字符,因此您在 AAA 和 ZZ 之后断言字符串结尾
  • 你能给出一些你想匹配的输入样本吗?还有其他你不想匹配的?
  • 您在寻找类似\b((?:AAA|BBC|CCC)(?=\d{3}\b)|(?:ZZ|XX|YY)(?=\d{2}\b)) 的东西吗?见regex101.com/r/cP1oX7/3
  • 你最后的调试图片有点漂亮。

标签: regex regex-lookarounds


【解决方案1】:

(因为我以后可能会忘记发布而发布:))

如果您想将AAAZZ 放在1 组中,并计划在大字符串中使用正则表达式,您可以使用\b 代替^/$,并将所有替代方案到非捕获组中,并在它们周围添加一个捕获组:

\b((?:AAA|BBC|CCC)(?=\d{3}\b)|(?:ZZ|XX|YY)(?=\d{2}\b))

demo

编辑:既然问题更新了,我觉得可以这样考虑:

^
(?:OOO)                     # "OOO"
(ABC|DEF)                   # "ABC" or "DEF"
(RR|AA|DD|EE)               # "RR" or "AA" or "DD" ior :"EE)
(
  (?:AAA|BBC|CCC)(?=\d{3}\b)  # "AAA" or "BBB" or "CCC" if followed by 3 digits
  |                         # or
  (?:ZZ|XX|YY)(?=\d{2}\b)     # "ZZ" or "XX" or "YY" if followed by 2 digits
)
.*                          # anything up to the end
$

demo。也许,我们可以使用\d{2,3} 来使用找到的数字,而不是.*。请检查最适合您的。

【讨论】:

    【解决方案2】:
    ^((AAA|BBC|CCC)(?=\d{3}$)|(ZZ|XX|YY)(?=\d{2}$))
    

    更新:抱歉——(我应该阅读 cmets)这实际上是 @nhahtdh 的建议

    Update2:使用完整的正则表达式(我们再次将 $ 移动到前瞻表达式中)

    ^(?:OOO)(ABC|DEF)(RR|AA|DD|EE)((?:AAA|BBC|CCC)(?=\d{3}$)|(?:ZZ|XX|YY)(?=\d{2}$))
    

    @stribizhev 建议用 word-boundary (\b) 替换 ^$ 显然是个好主意。

    【讨论】:

    • 好的,所以上面的工作是正确的,但是我可以发誓我在前瞻中尝试了 $。不确定我是否理解边界这个词。非常感谢:)
    • 大卫,记住 a(?=b)$ 总是失败:这意味着 a 后跟一个 b y 不会消耗(零长度字符串),然后是 end-字符串。不可能:a 后跟 b (=ab) 和 a 后跟 (zero length string)$ (=a$)
    【解决方案3】:

    谢谢大家,以下工作正常,还将查看单词边界并尝试理解该选项:)

    为清楚起见,此处显示的工作解决方案:

    ^(000|111|222)(ABC|DEF)(RR|AA|DD|EE)((?:AAA|BBC|CCC)(?=\d{3}$)|(?:ZZ|XX|YY)(?=\d{2}$))
    

    Debuggex Demo

    【讨论】:

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