如何否定捕获组?

时间:2017-05-04 04:38:41

标签: javascript regex

使用javascript regexp,我想找到"/foo""/foo d/"但不是"/foo /"的字符串;即,"注释字符",然后是没有终止注释的单词,或多个单词,其中终止位于短语的末尾(没有空格)。使情况复杂化,有三种可能的注释符号:/\|

我尝试过类似的事情:

/(?:^|\s)([\\\/|])((?:[\w_-]+(?![^\1]+[\w_-]\1))|(?:[\w\s]+[\w](?=\1)))/g

也就是说,从空格开始,然后是注释,然后是

  1. 单词后面没有(除了注释之外的任何内容),然后是字母和注释......或
  2. 可能是多个单词,后面紧跟注释字符。
  3. 问题是[^\1]:这并不是"除了注释字符之外的其他内容"在尖括号中。

    我可以重复整个短语三次,每个注释字符一个。有更好的想法吗?

1 个答案:

答案 0 :(得分:2)

正如您所提到的,[^\1]不起作用 - 它匹配任何不是字符1的内容。在JavaScript中,您可以使用前瞻:\1否定(?:(?!\1).)*。这不是那么有效,但它确实有效。

您的模式可以写成:

([\\\/|])([\w\-]+(?:(?:(?!\1).)*[\w\-]\1)?)

Working example at Regex101

  • \w已包含下划线。
  • 我使用的是可选组(a|ab),而不是替换(a(?:b)?) - 我们总是匹配第一个单词,可选的其他单词和标签。
  • 您可能仍希望在开头添加(?:^|\s)