正则表达式排除以前捕获的字符

时间:2014-08-12 20:58:48

标签: regex

排除运算符^如何与先前捕获的值一起使用?

注意下面正则表达式中的[^ \ 1]:

"abcdefgabcdefga".scan(/(\w)([^\1]+)(\1)/)
[
[0] [
    [0] "a",
    [1] "bcdefgabcdefg",
    [2] "a"
]
]

注意下面正则表达式中的[^ a]:

"abcdefgabcdefga".scan(/(\w)([^a]+)(\1)/)

[
  [0] [
      [0] "a",
      [1] "bcdefg",
      [2] "a"
  ]
]

似乎\ 1和硬编码'a'是两个不同的东西?

我正在使用ruby 2.1.1p76

2 个答案:

答案 0 :(得分:1)

没有\1确实代表对a的反向引用,但[^\1]这里的问题与[^a]不同,因为\1的特殊含义得到了失去了角色类。

正确的做法是使用这样的负面预测:

(\w)(?:(?!\1).)+(\1)

Ruby RegEx Demo

答案 1 :(得分:0)

正如在其他答案中已经说过的那样\ 1在方括号内时不是后向引用。 建议的解决方案是可行的,但只是抛弃另一个使用非贪婪匹配的替代方案:

/(\w)(.+?)(\1)/

一旦找到后面的参考,它就会停止。