正则表达式帮助 - Lookahead

Regular Expression Help - Lookahead

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

IE 我想匹配 AAA001 但不匹配 AAA00 而匹配 ZZ00。

我希望 AAA 和 ZZ 被return编辑为同一组,即 IE 组 1,但数字被排除在外..

这是我要完成的事情:

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

Debuggex Demo

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

谢谢

编辑:

所以这是完整 'obfuscated' 正则表达式的示例..

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

Debuggex Demo

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

大卫

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

更新:抱歉——(我应该阅读评论)这实际上是@nhahtdh

的建议

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

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

按照@stribizhev 的建议用词边界 (\b) 替换 ^$ 显然是个好主意。

(张贴,因为我稍后可能会忘记做:))

如果您想将 AAAZZ 归为一组,并计划在大字符串中使用正则表达式,您可以使用 \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} 来消耗找到的数字,而不是 .*。请查看最适合您的内容。

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

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

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

Debuggex Demo