我试图验证一些输入文本(这是一个更大的正则表达式的一部分),基本上我有一个值列表,在这个例子中替换为任意字符,我想匹配他们有正确的约定..
IE我希望匹配AAA001但不匹配AAA00并匹配ZZ00。
我希望将AAA和ZZ作为同一组IE组1返回,但不包括数字..
我在这里:
^((AAA|BBC|CCC)(?=\d{3})|(ZZ|XX|YY)(?=\d{2}))$
我在哪里出错前瞻的概念?我试过阅读但没有用。
由于
编辑:
所以这是一个完整的混淆'的例子。正则表达式..
^(?:OOO)(ABC|DEF)(RR|AA|DD|EE)((?:AAA|BBC|CCC)(?=\d{3})|(?:ZZ|XX|YY)(?=\d{2}))$
所以在我上面的最新例子中..我希望组3返回AAA | BBB | CCC但不包含数字..如果可能的话,组4可以返回序列号但不重要,它们可以被丢弃..
大卫
答案 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)
(发帖,因为我以后可以忘记这样做:))
如果您想将AAA
和ZZ
放入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}$))