27

一段JavaScript代码如下:

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

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

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

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

谢谢你。

4

5 回答 5

40

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

var num = "11222333";

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

console.log(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)
console.log(num.replace(re, "$1,$2"));

于 2013-05-22T23:00:09.357 回答
7

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

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

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

于 2013-05-22T23:01:33.317 回答
4

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

于 2013-05-22T23:00:53.800 回答
2

众所周知,在Javascript中,变量的名称应该以字母或_开头,

不,这不对。$1是一个完全有效的变量。你必须先分配给它:

$variable = "this is a test"

这就是 jQuery 如何使用一个变量$作为jQuery对象的别名。

于 2013-05-22T23:00:39.910 回答
1

该代码来自的书上说 $1 表示 RegExp.$1,$2 表示 RegExp.$2。

这本书是纸做的。纸不能反对任何在上面写字的人:-)。但也许你只是误解了这本书的实际内容。

实际上,这取决于上下文。

  1. 在, , , ...replace() 方法的上下文中(1 到 99)是占位符。它们由方法在内部处理(它们与,等无关,它们甚至可能没有定义(参见第2点))。请参阅String.prototype.replace() #Specifying_a_string_as_a_parameter将此与未使用标志时的方法返回值进行比较,这类似于的方法返回值。也与String$1$2$99replace() RegExp.$1RegExp.$2match() String gexec() RegExp参数隐式传递给指定为 的第二个参数的(可选)函数replace()
  2. RegExp.$1, RegExp.$2, ... RegExp.$9(仅限 1 到 9)是您在RegExp.$1-$9Deprecated and obsolete features中看到的非标准 属性。它们似乎是在您的浏览器上实现的,但是对于其他人来说,它们可能是未定义的。要使用它们,您需要始终在,等前面加上. 这些属性是静态的、只读的并存储在全局对象中,而不是单独的正则表达式对象中。但是,无论如何,你不应该使用它们。存储方法内部使用的直通RegExp$1$2RegExp.RegExp $1$99replace() String其他地方

祝你今天过得愉快!

于 2018-04-10T23:35:06.207 回答