如何在使用正则表达式时解释Javascript中的"$ 1,$ 2"?

use*_*994 18 javascript regex

一段Javascript代码如下:

    num="11222333";
    re = /(\d+)(\d{3})/;
    re.test(num);
    num.replace(re, "$1,$2");
Run Code Online (Sandbox Code Playgroud)

我无法理解"$ 1,$ 2"的语法.这段代码来自的书说$ 1表示RegExp.$ 1,$ 2表示RegExp.$ 2.但这些解释引出了更多问题:

  1. 众所周知,在Javascript中,变量的名称应以letter或_开头,$ 1如何才能成为RegExp成员变量的有效名称?

  2. 如果我输入$ 1,命令行说它没有定义; 如果我输入"$ 1",命令行只回显$ 1,而不是11222.那么,replace方法如何知道"$ 1,$ 2"是什么意思?

谢谢.

voi*_*hos 27

它不是"变量" - 它是在.replace()调用中使用的占位符.$n表示nth正则表达式的捕获组.

num="11222333";

// This regex captures the last 3 digits as capture group #2
// and all preceding digits as capture group #1
re = /(\d+)(\d{3})/;

re.test(num);

// This replace call replaces the match of the regex (which happens
// to match everything) with the first capture group ($1) followed by
// a comma, followed by the second capture group ($2)
num.replace(re, "$1,$2");
Run Code Online (Sandbox Code Playgroud)


Mar*_*ley 6

$1 是正则表达式中的第一组,$2 是第二组。组由括号定义,因此您的第一个组 ($1) 是与 (\d+) 匹配的组。您需要阅读正则表达式以了解匹配的内容。

众所周知,在Javascript中,变量名应该以字母或_开头,这里$1怎么可能是RegExp成员变量的有效名称呢?

这不是真的。$ 是一个有效的变量名,$1 也是如此。你可以通过尝试来发现这一点。请参阅 jQuery 和许多其他框架。


Nie*_*jes 5

您误解了那行代码。您应该将字符串视为"$1,$2"一种格式说明符,该replace函数在内部使用该格式说明符来知道要做什么。它使用先前测试的正则表达式,该表达式产生2个结果(两个带括号的块),并重新格式化结果。$1指的是第一场比赛,指的是第二场比赛$2num字符串的预期内容因此位于11222,333此代码位之后。