我发现了一段 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”在“foo bar”中的位置。匹配的子字符串可以从结果数组的元素[1],...,[n]或预定义的RegExp对象的属性$1,...,$9中调用。$1
指的是由(.+)
匹配的内容。RegExp.$n
属性(其中 n
是一个数字 1-9)返回匹配中最后一个第 n
个括号(捕获)子字符串。RegExp
经历重大变化并且许多来自 RegExp.prototype.exec(string)
的结果从 RegExp
对象移动到 RegExp
实例时,所有的 .$
属性(以及它们的全名版本(除了 .multiline
))“消失”了。
您可以在ECMA-262 3规范的以下部分找到定义和参考:
String.prototype.match(regexp)
String.prototype.replace(regexp)
RegExp.prototype.exec(string)
$1
是第一个捕获到的内容。如果你有更多的捕获,可以使用$2
,$3
等。
例如:
"abc".replace(/(.)/, "$1$1"); // aabc
"abc".replace(/(.{2})/, "$1$1"); // ababc
"abc".replace(/(.)(.)/, "$2$1"); // bac
如前所述,这些结构被称为捕获括号组,它们主要用于引用在 RegExp 相关操作成功执行后保存/记忆的匹配项。
同样,如前所述,我不建议在您的代码中使用任何一个,除非已经确保了良好的受控环境/上下文,例如由 String.prototype
对象上的本地 replace()
方法提供的环境。
()
)。因此,它将是(.+)
。在您的情况下,是方括号内的文本。 - gen_EricRegExp.$1
之前,如果还有其他代码在最后一个 RegExp 之后被调用(例如setTimeout
或事件触发),你可能会得到意外的值。 - Paul S.