正则表达式帮助 - Lookahead

时间:2015-05-07 09:37:48

标签: regex regex-lookarounds

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

IE我希望匹配AAA001但不匹配AAA00并匹配ZZ00。

我希望将AAA和ZZ作为同一组IE组1返回,但不包括数字..

我在这里:

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

Regular expression visualization

Debuggex Demo

我在哪里出错前瞻的概念?我试过阅读但没有用。

由于

编辑:

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

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

Regular expression visualization

Debuggex Demo

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

大卫

3 个答案:

答案 0 :(得分:2)

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

更新:对不起 - (我应该看过评论)这实际上是@nhahtdh

的建议

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

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

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

答案 1 :(得分:2)

(发帖,因为我以后可以忘记这样做:))

如果您想将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}而不是{{1}}。请检查最适合你的。

答案 2 :(得分:0)

感谢所有人,下面的工作正常,并且还会查看单词边界并尝试理解该选项:)

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

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

Regular expression visualization

Debuggex Demo