RegExp.$1是什么意思?

18

我发现了一段 JScript 代码:

RegExp.$1

有人知道它是做什么的吗?

如果我单独输出它,什么也没有,甚至没有错误。

http://www.w3schools.com/jsref/jsref_obj_regexp.asp上我找不到关于它的任何参考信息。

在这段代码之前刚刚进行了正则表达式搜索,我怀疑它与此有关:

.search(/^__product\[(.+)\]$/)

3
它获取最近运行的正则表达式中第一个捕获组的值。 - gen_Eric
我上一次运行的正则表达式中的第一个捕获组是什么? - Graham
1
捕获组是括号(())。因此,它将是(.+)。在您的情况下,是方括号内的文本。 - gen_Eric
1
我建议不要使用这种方法,因为在你查找 RegExp.$1 之前,如果还有其他代码在最后一个 RegExp 之后被调用(例如 setTimeout 或事件触发),你可能会得到意外的值。 - Paul S.
顺便说一句,我建议使用 Mozilla 的文档而不是 w3schools 的。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript - gen_Eric
显示剩余2条评论
6个回答

21

字面表达式RegExp.$1将为您获取最后运行的正则表达式的第一个捕获组的值。无论该正则表达式是什么。

例如:

var match = /_(.*)_/.exec('_test_');

var newMatch = '123-abc'.match(/(\d*)-(\w*)/);
var num = RegExp.$1; // '123';

RegExp.$1 是全局变量,因此可以从页面的任何位置访问,无论其正则表达式在哪里运行。

在看到这个问题之前,我从未见过这种语法使用过,也不建议使用它,因为我找不到相关文档。另外,你页面上运行的 任何 正则表达式都会修改这个属性。如果你想获取捕获组,我会使用 String.matchRegExp.exec 返回的数组。

编辑: 我找到了一些关于这个的文档:http://msdn.microsoft.com/en-us/library/ie/24th3sah(v=vs.94).aspx

编辑2: 我找到了更多关于这个的信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Deprecated_and_obsolete_features#RegExp_Properties

RegExp.$1 已经被弃用了。这意味着将来的浏览器可能会删除这个“特性”,因此我建议不要使用它。


1
一定要喜欢Mozilla说它已经过时了,而Microsoft却没有 :-P - gen_Eric

3

$1将返回与正则表达式匹配的第一个组。

在您的示例中,存储在$1中的值是与.+匹配的任何内容。

组由括号表示,您可以有多个。每个保存的组都只会使用$递增数字,即$1,$2,$3...

例如:

如果您的输入为__product[Version 12 Coupe],那么$1将包含Version 12 Coupe


3

1
为了补充细节:
正如已经提到的,RegExp.$n 属性(其中 n 是一个数字 1-9)返回匹配中最后一个第 n 个括号(捕获)子字符串。
这些属性最初在 JavaScript 1.2 中实现,在 JavaScript 1.5 中被弃用 - 当 RegExp 经历重大变化并且许多来自 RegExp.prototype.exec(string) 的结果从 RegExp 对象移动到 RegExp 实例时,所有的 .$ 属性(以及它们的全名版本(除了 .multiline))“消失”了。
非标准的 $1、$2、$3、$4、$5、$6、$7、$8 和 $9 属性是正则表达式的静态和只读属性(包含括号子字符串匹配),并且在成功匹配时进行修改。它们不是单个正则表达式对象的属性。相反,您始终将它们用作 RegExp.$1、...、RegExp.$9。可能的括号子字符串数量是无限的(当然),但 RegExp 对象只能保存最后九个。非标准 = 不属于任何当前规范!

您可以在ECMA-262 3规范的以下部分找到定义和参考:

  • 15.5.4.10 - String.prototype.match(regexp)
  • 15.5.4.11 - String.prototype.replace(regexp)
  • 15.10.2.1 - 正则表达式对象符号的NCapturingParens
  • 15.10.6.2 - RegExp.prototype.exec(string)

1

$1是第一个捕获到的内容。如果你有更多的捕获,可以使用$2$3等。

例如:

"abc".replace(/(.)/, "$1$1"); // aabc
"abc".replace(/(.{2})/, "$1$1"); // ababc
"abc".replace(/(.)(.)/, "$2$1"); // bac

0

如前所述,这些结构被称为捕获括号组,它们主要用于引用在 RegExp 相关操作成功执行后保存/记忆的匹配项。

同样,如前所述,我不建议在您的代码中使用任何一个,除非已经确保了良好的受控环境/上下文,例如由 String.prototype 对象上的本地 replace() 方法提供的环境。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接