RegExp:[]里面的反向引用

时间:2011-08-26 17:00:16

标签: javascript regex

'"aaa" "bbb"'.match(/("|')[^\1]+\1/g)
// ['"aaa" "bbb"']

'"aaa" "bbb"'.match(/("|')[^"]+\1/g)
// ['"aaa"', '"bbb"']

为什么[^\1]+代替[^"]+使RegExp变得贪婪?

2 个答案:

答案 0 :(得分:3)

  

为什么[^\1]+代替[^"]+使RegExp变得贪婪?

这不是你认为的那样。

首先,+ 总是 最大匹配,你称之为“贪婪”。它是+? 最小匹配

其次,更重要的是,反向引用不会发生在方括号字符类中。你不小心刚要求除Control-A之外的任何角色。这是因为反斜杠后跟数字意味着代码指向八进制表示法,如\177 DELETE \x7F的{​​{1}}或SPACE \40的{​​{1}},或者\x20表示NULL。所以当你写\0时,你刚刚使用了U + 0001或\1。不要那样做。 :)

你可能想要使用

\x01

代替。您需要(["'])(?:(?!\1).)+\1 模式,以便点可以匹配换行符,我似乎记得Javascript有一些搞砸了。


编辑:根据this,笨拙的旧Javascript无法使点匹配换行符。什么是rimnods!当然,因为Javascript无法执行Unicode正则表达式,所以您无法使用UTS#18’s RL1.2所需的/s

这意味着如果您的引用字符串中可能包含换行符,则必须使用\p{Any}之类的蹩脚kludge。

答案 1 :(得分:1)

[^\1]+没有按照您的想法执行,它与不是\1的字母匹配。其中包括""'。

正确的替代方案,使用否定前瞻:

/(["'])(?:(?!\1).)*\1/g

或更简单地说:

/"[^"]*"|'[^']*'/g