2013-08-21 47 views
14

我在JScript中遇到的一段代碼:

RegExp.$1 

有誰知道它做什麼?

如果我自己輸出它,我什麼也沒有得到,甚至沒有錯誤。

我無法找到http://www.w3schools.com/jsref/jsref_obj_regexp.asp

任何引用它有一個正則表達式搜索之前,爲了這段代碼,我懷疑有什麼用它做:

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

它得到第一個捕獲組的值的最後的正則表達式跑去。 –

+0

我最後一個正則表達式中的第一個捕獲組會運行什麼? – Graham

+1

捕獲組是括號('()')。所以,這將是'(。+)'。在你的情況下,'[]'裏面的文字。 –

回答

16

字面表達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

愛得如何Mozilla說它已被棄用,並且微軟沒有:-P –

3

$1將返回與正則表達式匹配的第一個組。

在你的榜樣,存儲在$1值無論是匹配.+

該小組由括號表示,你可以有數倍。每個組保存只會增加與$數字,即$1, $2, $3...

例子:

如果輸入是__product[Version 12 Coupe]然後$1將包含Version 12 Coupe

0

$1是無論是在第一捕獲匹配。如果您有更多的捕捉可以使用$2$3

例:

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

如前所述,這些結構稱爲捕獲圓括號組,它們主要用於引用成功執行RegExp相關操作後保存/記憶的匹配。另外,如前所述,我不建議在您的代碼中使用它們中的任何一種,除非受到良好控制的環境/環境得到保護,例如在String.prototype對象上找到的本地replace()方法提供的環境/環境。

0

要添加一些細節:

(前面已經說了)的RegExp.$n - 屬性(其中n是一個單一的數字1-9)返回最後n括號(捕獲)在比賽子。

這些特性首次在JavaScript 1.2實現,並棄用在JavaScript 1.5 - 當RegExp進行了重大變化,許多從RegExp.prototype.exec(string)的結果是從RegExp對象移到RegExp實例和所有.$屬性(和其全名稱版本(.multiline除外))「走開」。


非標準$1$2$3$4$5$6$7$8$9性質靜態只讀正則表達式的性質(即包含加括號的子字符串匹配)並且當成功匹配時被修改

它們是不是單個正則表達式對象的屬性。相反,您始終將它們用作RegExp.$1,...,RegExp.$9

可能的加括號的子串的數目是無限的(當然),但RegExp對象只能容納最後九個。

非標準=不是任何當前規範的一部分!


您可以找到ECMA-262 3規格的以下部分的定義和引用:

  • 15.5.4.10 - String.prototype.match(regexp)
  • 15.5.4。11 - String.prototype.replace(regexp)
  • 15.10.2.1 - RegExp對象符號的NCapturingParens
  • 15.10.6.2 - RegExp.prototype.exec(string)
相關問題