如何匹配但不捕获正则表达式的一部分?
我有一个字符串列表。 其中一些形式为123-...456
。 可变部分“...”可以是:
123-apple-456
123-banana-456
123-456
(注意只有一个连字符) “apple”或“banana”以外的任何词都是无效的。
对于这三种情况,我想分别匹配“apple”,“banana”和“”。 请注意,我从不想捕捉连字符,但我总是想要匹配它。 如果字符串不是如上所述的形式123-...456
,则根本不匹配。
我如何写一个正则表达式来做到这一点? 假设我有一种风格,允许向前看,向后看,环视和非捕捉组。
这里的关键观察是,当你有“苹果”或“香蕉”时,你还必须有尾部连字符,但你不想匹配它。 当你匹配空白字符串时,你不能有尾随连字符。 我认为,封装这个断言的正则表达式是正确的。
不捕获某些东西的唯一方法是使用环视声明:
(?<=123-)((apple|banana)(?=-456)|(?=456))
因为即使使用非捕获组(?:…)
,整个正则表达式也会捕获它们的匹配内容。 但是这个正则表达式只匹配apple
或者banana
如果它的前面是123-
和后面是-456
,或者它匹配空白字符串(如果前面是123-
和后面是456
。
更新:感谢GermánRodríguezHerrera!
在javascript中尝试: /123-(apple(?=-)|banana(?=-)|(?!-))-?456/
请记住,结果是在第1组中
Debuggex演示
尝试:
123-(?:(apple|banana|)-|)456
这将匹配apple
, banana
,或一个空白的字符串,并在它后面会有一个0或1连字符。 我错在没有需要一个捕获组。 傻我。