什么是\\ $&在“str.replace(特价,”\\ $&“)”“是什么意思?

时间:2011-01-14 07:08:56

标签: javascript regex

我正在引用Case insensitive string replacement in JavaScript?中的代码:

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

\\$&是什么意思?

我认为\\会转义\字符。然后$&,我认为应该$1匹配第一场比赛? $1无法正常工作

3 个答案:

答案 0 :(得分:4)

$&表示正则表达式匹配的整个(子)字符串,与捕获组无关。您获得的替换结果是字符串中的每个匹配都由字面反斜杠(由\\表示)进行转义。由于此处使用的正则表达式仅包含字符类,因此“每个匹配”指的是匹配的字符类中列出的每个元字符。

例如,正则表达式字符串[abc]将替换为\[abc\]

  • [匹配,因为它出现在字符类中。代表$&,替换为\[

  • abc不是字符类中的元字符,因此会被忽略

  • ]匹配,因为它出现在字符类中。代表$&,替换为\]

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

该正则表达式未使用捕获组。显然他正在使用一个普通的正则表达式变量:

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

模糊的事实:在Perl中有一个名为quotemeta(“你的字符串”)的函数来执行此操作 或者可以使用\ Q在正则表达式中内联。我喜欢Perl。

作为旁注,他可能已经遗漏了carret ^并且可能,但不确定,$ 没有内置或内联方法的事实可能是件坏事。因为正则表达式碎片可能存在问题,所以必须考虑逃避这样的metachars。