我正在引用Case insensitive string replacement in JavaScript?中的代码:
RegExp.escape = function(str)
{
var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); // .*+?|()[]{}\
return str.replace(specials, "\\$&");
}
\\$&
是什么意思?
我认为\\
会转义\
字符。然后$&
,我认为应该$1
匹配第一场比赛? $1
无法正常工作
答案 0 :(得分:4)
$&
表示正则表达式匹配的整个(子)字符串,与捕获组无关。您获得的替换结果是字符串中的每个匹配都由字面反斜杠(由\\
表示)进行转义。由于此处使用的正则表达式仅包含字符类,因此“每个匹配”指的是匹配的字符类中列出的每个元字符。
例如,正则表达式字符串[abc]
将替换为\[abc\]
:
[
匹配,因为它出现在字符类中。代表$&
,替换为\[
a
,b
和c
不是字符类中的元字符,因此会被忽略
]
匹配,因为它出现在字符类中。代表$&
,替换为\]
答案 1 :(得分:0)
$&
是整个匹配,在示例中是匹配的任何特殊字符。 $1
不起作用,因为正则表达式中没有组(...)
(尽管如果在方括号周围添加括号,那么它也可以工作)。
是的,第一个'\'会逃避另一个(通常反斜杠与下面的字符一起使用以赋予它特殊含义,因此要获得文字反斜杠,需要使用另一个反斜杠进行转义)。
答案 2 :(得分:0)
该正则表达式未使用捕获组。显然他正在使用一个普通的正则表达式变量:
$& returns the entire matched string (some systems its $0)
在这种情况下,他一次只匹配1个字符
相当于s/[.*+?|()\[\]{}\\]/\\$&/g
模糊的事实:在Perl中有一个名为quotemeta(“你的字符串”)的函数来执行此操作 或者可以使用\ Q在正则表达式中内联。我喜欢Perl。
作为旁注,他可能已经遗漏了carret ^并且可能,但不确定,$ 没有内置或内联方法的事实可能是件坏事。因为正则表达式碎片可能存在问题,所以必须考虑逃避这样的metachars。