我有一个字符串列表。其中一些是123 -… 456的形式。可变部分“…”可以是:
>字符串“apple”后跟一个连字符,例如。 123-apple-456
>字符串“banana”,后跟连字符,例如。 123-banana-456
>空白字符串,例如123-456(注意只有一个连字符)
除“apple”或“banana”之外的任何字词都无效。
对于这三种情况,我想分别匹配“苹果”,“香蕉”和“”。注意,我不想捕获连字符,但我总是想匹配它。如果字符串不是如上所述的形式123 -… 456,则根本没有匹配。
我如何写一个正则表达式来做到这一点?假设我有一种风味,允许lookahead,lookbehind,lookaround和非捕获组。
这里的关键观察是,当你有“苹果”或“香蕉”,你也必须有结尾连字符,但你不想匹配它。当您匹配空白字符串时,您不能使用尾随连字符。封装这个断言的正则表达式将是正确的,我想。
唯一不捕获东西的方法是使用
look-around assertions:
(?<=123-)((apple|banana)(?=-456)|(?=456))
因为即使使用non-capturing groups (?:…)
,整个正则表达式捕获它们匹配的内容。但是这个正则表达式只匹配苹果或香蕉,如果它前面有123-和后面的-456,或者它匹配空字符串,如果前面有123-和后面的456。