我在 JScript 中遇到过一段代码:
RegExp.$1
有人知道它的作用吗?
如果我自己输出它,我什至没有得到任何错误。
我在http://www.w3schools.com/jsref/jsref_obj_regexp.asp找不到任何参考
在这段代码之前有一个正则表达式搜索,我怀疑这与它有关:
.search(/^__product\[(.+)\]$/)
我在 JScript 中遇到过一段代码:
RegExp.$1
有人知道它的作用吗?
如果我自己输出它,我什至没有得到任何错误。
我在http://www.w3schools.com/jsref/jsref_obj_regexp.asp找不到任何参考
在这段代码之前有一个正则表达式搜索,我怀疑这与它有关:
.search(/^__product\[(.+)\]$/)
文字表达式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
将返回与正则表达式匹配的第一个组。
在您的示例中,存储的值$1
是匹配的值.+
该组由括号表示,您可以有多个。每个保存的组只会用 增加数字$
,即$1, $2, $3...
例子:
如果您的输入是__product[Version 12 Coupe]
然后$1
将包含Version 12 Coupe
这些与捕获括号一起工作。例如,/(foo)/
匹配并记住“foo bar”中的“foo”。可以从结果数组的元素 [1]、...、[n] 或预定义的 RegExp 对象的属性 $1、...、$9 中调用匹配的子字符串。
在您的示例中, the$1
指的是由(.+)
请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
$1
是第一次捕获中匹配的内容。如果您有更多捕获,则可以使用$2
等$3
。
前任:
"abc".replace(/(.)/, "$1$1"); // aabc
"abc".replace(/(.{2})/, "$1$1"); // ababc
"abc".replace(/(.)(.)/, "$2$1"); // bac
添加一些细节:
(如前所述)RegExp.$n
- 属性(其中n
是单个数字 1-9)返回匹配中最后一个带n
括号(捕获)的子字符串。
这些属性首先在 JavaScript 1.2 中实现并在 JavaScript 1.5 中弃用 - 当RegExp
经历了重大更改并且许多结果从对象RegExp.prototype.exec(string)
移动到实例和所有属性(及其全名版本(除了))“去了离开”。RegExp
RegExp
.$
.multiline
非标准的1 , $1
, $2
, $3
, $4
, $5
, $6
, $7
,$8
属性$9
是正则表达式的静态和只读属性(包含带括号的子字符串匹配),并且在成功匹配时被修改。
它们不是单个正则表达式对象的属性。相反,您总是将它们用作RegExp.$1
, ..., RegExp.$9
。
可能的带括号的子字符串的数量是无限的(当然),但RegExp
对象只能保存最后九个。
1非标准 = 不属于任何当前规范!
您可以在ECMA-262 3规范的以下部分中找到定义和参考:
String.prototype.match(regexp)
String.prototype.replace(regexp)
RegExp.prototype.exec(string)
如前所述,这些结构称为捕获括号组,它们主要用于引用成功执行 RegExp 相关操作后保存/记住的匹配项。
此外,如前所述,我不建议在您的代码中使用它们中的任何一个,除非一个受良好控制的环境/上下文是安全的,例如对象replace()
上的本机方法提供的环境/上下文String.prototype
。