如何匹配但不捕获正则表达式的一部分?

我有一个字符串列表。 其中一些形式为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
    

    这将匹配applebanana ,或一个空白的字符串,并在它后面会有一个0或1连字符。 我错在没有需要一个捕获组。 傻我。

    链接地址: http://www.djcxy.com/p/74829.html

    上一篇: How to match, but not capture, part of a regex?

    下一篇: Javascript: negative lookbehind equivalent?