我在JScript中遇到过一段代码:
RegExp.$1
有人知道它的作用吗?
如果我自己输出它,我甚至都没有得到任何错误。
我在http://www.w3schools.com/jsref/jsref_obj_regexp.asp
找不到任何引用在这段代码之前有一个正则表达式搜索,我怀疑它与它有关:
.search(/^__product\[(.+)\]$/)
答案 0 :(得分:20)
文字表达式RegExp.$1
将为您提供上一个正则表达式运行的第一个捕获组的值。无论那个正则表达式是什么。
例如:
var match = /_(.*)_/.exec('_test_');
var newMatch = '123-abc'.match(/(\d*)-(\w*)/);
var num = RegExp.$1; // '123';
RegExp.$1
是全球可用的,因此可以从页面中的任何位置访问它,无论正则表达式本身在何处运行。
在看到这个问题之前,我从未见过这种语法,我不建议使用它,因为我找不到它的文档。此外,任何正则表达式在您的页面上运行,无论在何处,都将修改此属性。如果你想获得捕获组,我会使用从String.match
或RegExp.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规范的以下部分中找到定义和参考:
RegExp
String.prototype.match(regexp)
String.prototype.replace(regexp)