RegExp。$ 1做什么

时间:2013-08-21 15:52:47

标签: javascript regex

我在JScript中遇到过一段代码:

RegExp.$1

有人知道它的作用吗?

如果我自己输出它,我甚至都没有得到任何错误。

我在http://www.w3schools.com/jsref/jsref_obj_regexp.asp

找不到任何引用

在这段代码之前有一个正则表达式搜索,我怀疑它与它有关:

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

6 个答案:

答案 0 :(得分:20)

文字表达式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 :(得分:3)

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

在您的示例中,$1中存储的值是匹配.+

的值

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

示例:

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

答案 2 :(得分:3)

这些与捕获括号一起使用。例如,/(foo)/匹配并记住“foo bar”中的“foo”。可以从结果数组的元素[1],...,[n]或预定义的RegExp对象的属性$ 1,...,$ 9中调用匹配的子字符串。

在您的示例中,$1指的是(.+)

所做的匹配

请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp

答案 3 :(得分:1)

$1是第一次捕获中匹配的内容。如果您有更多捕获,则可以使用$2$3

例如:

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

答案 4 :(得分:0)

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

此外,如前所述,我建议您不要在代码中使用其中任何一个,除非有良好控制的环境/上下文,例如replace()方法提供的方法。 {1}}对象。

答案 5 :(得分:0)

添加一些细节:

(正如已经说过的那样)RegExp.$n - 属性(其中n是单个数字1-9)返回最后n th 括号(捕获)匹配中的子字符串。

这些属性首先在JavaScript 1.2中实现,并在JavaScript 1.5中弃用 - 当RegExp经历重大更改并且RegExp.prototype.exec(string)的许多结果从RegExp对象移动到RegExp个实例和所有.$属性(及其全名版本(.multiline除外))"消失了#34;。


非标准 1 $1$2$3$4,{{1} },$5$6$7$8属性是正常表达式的静态只读属性(包含带括号的子字符串匹配)并且只要成功匹配就进行修改

它们不是单个正则表达式对象的属性。相反,您始终将它们用作$9,...,RegExp.$1

可能带括号的子串的数量是无限的(当然),但RegExp.$9对象只能保留最后九个。

1 非标准=不属于任何现行规范!


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

  • 15.5.4.10 - RegExp
  • 15.5.4.11 - String.prototype.match(regexp)
  • 15.10.2.1 - RegExp对象表示法' NCapturingParens
  • 15.10.6.2 - String.prototype.replace(regexp)