2011-01-14 35 views
3

我指的代码Case insensitive string replacement in JavaScript?

RegExp.escape = function(str) 
{ 
    var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); // .*+?|()[]{}\ 
    return str.replace(specials, "\\$&"); 
} 

是什么\\$&意思?

我认为\\逃脱\字符。然后$&,我认为应该是$1匹配第一场比赛? tho $1不能正常工作

回答

4

$&表示与正则表达式匹配的整个(子)字符串,与捕获组无关。您得到的替换结果是您的字符串中的每个匹配字符都会被文字反斜线(由\\表示)转义。由于这里使用的正则表达式只包含一个字符类,“每个匹配”指的是匹配的字符类中列出的每个元字符。

例如,正则表达式串[abc]将与\[abc\]取代:当它在字符类发生

  • [匹配。通过$&代表,替换\[

  • abc不在字符类的元字符,所以当它在字符类时他们忽略

  • ]匹配。通过$&代表,替换\]

0

$&是整个匹配,在示例中是无论哪个特殊字符匹配。 $1不起作用,因为在正则表达式中没有组(...)(尽管如果您在方括号周围添加了括号,那么它也会起作用)。

是的,第一个'\'转义另一个(通常反斜杠与以下字符一起使用以赋予其特殊含义,因此要获得文字反斜杠,需要使用另一个反斜杠进行转义)。

0

这正则表达式是不使用捕获组。显然,他是使用一个共同的正则表达式变量:

$& returns the entire matched string (some systems its $0)
在这种情况下,他只是在相当于s/[.*+?|()\[\]{}\\]/\\$&/g 时间匹配1个字符

暗纹的事实:在Perl有一个函数调用quotemeta(“你字符串“),它可以这样做
或者它可以用\ Q在正则表达式中内联。我喜欢Perl。

作为一个便笺,他可能已经遗漏了底座^并且可能但不确定的是,没有内置或内联方法的事实可能是一件坏事。像这样逃脱metachars必须考虑出来,因为正则表达式片段可能有问题。