我有一个字符串列表.其中一些是形式123-...456.可变部分"......"可以是:
123-apple-456123-banana-456123-456(注意只有一个连字符)除"apple"或"banana"之外的任何单词均无效.
对于这三种情况,我想分别匹配"apple","banana"和"".请注意,我从不想捕获连字符,但我总是希望匹配它.如果字符串不是123-...456如上所述的形式,那么根本就没有匹配.
如何编写正则表达式来执行此操作?假设我有一种风格,允许前瞻,后视,环视和非捕获组.
这里的关键观察是,当你有"苹果"或"香蕉"时,你还必须有尾随连字符,但你不想匹配它.当您匹配空白字符串时,您不能使用尾随连字符.我认为,封装这个断言的正则表达式将是正确的.
Gum*_*mbo 237
不捕获内容的唯一方法是使用环视断言:
(?<=123-)((apple|banana)(?=-456)|(?=456))
因为即使使用非捕获组(?:…),整个正则表达式也会捕获其匹配的内容.但是这个正则表达式只匹配apple或者banana如果它前面123-跟着-456,后面跟着它,或者它匹配空字符串,如果它前面123-跟着后跟456.
|Lookaround  |    Name      |        What it Does                       |
-----------------------------------------------------------------------
|(?=foo)     |   Lookahead  | Asserts that what immediately FOLLOWS the |
|            |              |  current position in the string is foo    |
-------------------------------------------------------------------------
|(?<=foo)    |   Lookbehind | Asserts that what immediately PRECEDES the|
|            |              |  current position in the string is foo    |
-------------------------------------------------------------------------
|(?!foo)     |   Negative   | Asserts that what immediately FOLLOWS the |
|            |   Lookahead  |  current position in the string is NOT foo|
-------------------------------------------------------------------------
|(?<!foo)    |   Negative   | Asserts that what immediately PRECEDES the|
|            |   Lookbehind |  current position in the string is NOT foo|
-------------------------------------------------------------------------
op1*_*kun 14
更新:感谢GermánRodríguezHerrera!
在javascript尝试: /123-(apple(?=-)|banana(?=-)|(?!-))-?456/
请记住,结果在第1组中
尝试:
123-(?:(apple|banana|)-|)456
这将匹配apple,banana或一个空字符串,并在其后面将有一个0或1个连字符.我不需要捕获组.傻我.
小智 6
我修改了其中一个答案(@op1ekun):
123-(apple(?=-)|banana(?=-)|(?!-))-?456
原因是@op1ekun 的答案也匹配"123-apple456",在苹果之后没有连字符。