正则表达式帮助 - Lookahead
Regular Expression Help - Lookahead
我正在尝试验证一些输入文本(这是一个更大的正则表达式的一部分),基本上我有一个值列表,在此示例中替换为任意字符,我想匹配它们具有正确的约定..
IE 我想匹配 AAA001 但不匹配 AAA00 而匹配 ZZ00。
我希望 AAA 和 ZZ 被return编辑为同一组,即 IE 组 1,但数字被排除在外..
这是我要完成的事情:
^((AAA|BBC|CCC)(?=\d{3})|(ZZ|XX|YY)(?=\d{2}))$
前瞻的概念哪里出了问题?我试过阅读但无济于事。
谢谢
编辑:
所以这是完整 'obfuscated' 正则表达式的示例..
^(?:OOO)(ABC|DEF)(RR|AA|DD|EE)((?:AAA|BBC|CCC)(?=\d{3})|(?:ZZ|XX|YY)(?=\d{2}))$
所以在我上面的最新示例中..我希望第 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
) 替换 ^
和 $
显然是个好主意。
(张贴,因为我稍后可能会忘记做:))
如果您想将 AAA
和 ZZ
归为一组,并计划在大字符串中使用正则表达式,您可以使用 \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}$))
我正在尝试验证一些输入文本(这是一个更大的正则表达式的一部分),基本上我有一个值列表,在此示例中替换为任意字符,我想匹配它们具有正确的约定..
IE 我想匹配 AAA001 但不匹配 AAA00 而匹配 ZZ00。
我希望 AAA 和 ZZ 被return编辑为同一组,即 IE 组 1,但数字被排除在外..
这是我要完成的事情:
^((AAA|BBC|CCC)(?=\d{3})|(ZZ|XX|YY)(?=\d{2}))$
前瞻的概念哪里出了问题?我试过阅读但无济于事。
谢谢
编辑:
所以这是完整 'obfuscated' 正则表达式的示例..
^(?:OOO)(ABC|DEF)(RR|AA|DD|EE)((?:AAA|BBC|CCC)(?=\d{3})|(?:ZZ|XX|YY)(?=\d{2}))$
所以在我上面的最新示例中..我希望第 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
) 替换 ^
和 $
显然是个好主意。
(张贴,因为我稍后可能会忘记做:))
如果您想将 AAA
和 ZZ
归为一组,并计划在大字符串中使用正则表达式,您可以使用 \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}$))