18

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

RegExp.$1

有人知道它的作用吗?

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

我在http://www.w3schools.com/jsref/jsref_obj_regexp.asp找不到任何参考

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

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

6 回答 6

21

文字表达式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已弃用。这意味着未来的浏览器可能会删除这个“功能”,所以我建议不要使用它。

于 2013-08-21T16:00:01.857 回答
3

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

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

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

例子:

如果您的输入是__product[Version 12 Coupe]然后$1将包含Version 12 Coupe

于 2013-08-21T15:56:11.953 回答
3

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

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

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

于 2013-08-21T15:57:03.727 回答
1

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

前任:

"abc".replace(/(.)/, "$1$1"); // aabc
"abc".replace(/(.{2})/, "$1$1"); // ababc
"abc".replace(/(.)(.)/, "$2$1"); // bac
于 2013-08-21T15:57:34.067 回答
1

添加一些细节:

(如前所述)RegExp.$n- 属性(其中n是单个数字 1-9)返回匹配中最后一个带n括号(捕获)的子字符串。

这些属性首先在 JavaScript 1.2 中实现并在 JavaScript 1.5 中弃用 - 当RegExp经历了重大更改并且许多结果从对象RegExp.prototype.exec(string)移动到实例和所有属性(及其全名版本(除了))“去了离开”。RegExpRegExp.$.multiline


非标准的1 , $1 , $2, $3, $4, $5, $6, $7,$8属性$9是正则表达式的静态只读属性(包含带括号的子字符串匹配),并且在成功匹配时被修改

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

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

1非标准 = 不属于任何当前规范!


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

  • 15.5.4.10 -String.prototype.match(regexp)
  • 15.5.4.11 -String.prototype.replace(regexp)
  • 15.10.2.1 - RegExp 对象表示法的NCCapturingParens
  • 15.10.6.2 -RegExp.prototype.exec(string)
于 2015-04-15T23:04:17.173 回答
0

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

此外,如前所述,我不建议在您的代码中使用它们中的任何一个,除非一个受良好控制的环境/上下文是安全的,例如对象replace()上的本机方法提供的环境/上下文String.prototype

于 2015-03-07T18:15:13.637 回答