我在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
已被棄用。這意味着未來的瀏覽器可能會刪除這個「功能」,所以我建議不要使用它。
愛得如何Mozilla說它已被棄用,並且微軟沒有:-P –
$1
將返回與正則表達式匹配的第一個組。
在你的榜樣,存儲在$1
值無論是匹配.+
該小組由括號表示,你可以有數倍。每個組保存只會增加與$
數字,即$1, $2, $3...
例子:
如果輸入是__product[Version 12 Coupe]
然後$1
將包含Version 12 Coupe
與捕獲括號結合這些工作。例如,/(foo)/
匹配並記住「foo bar」中的'foo'。可以從結果數組的元素[1],...,[n]或從預定義的RegExp對象的屬性$ 1,...,$ 9中調用匹配的子字符串。
在您的例子中,$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相關操作後保存/記憶的匹配。另外,如前所述,我不建議在您的代碼中使用它們中的任何一種,除非受到良好控制的環境/環境得到保護,例如在String.prototype
對象上找到的本地replace()
方法提供的環境/環境。
要添加一些細節:
(前面已經說了)的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規格的以下部分的定義和引用:
String.prototype.match(regexp)
String.prototype.replace(regexp)
RegExp.prototype.exec(string)
它得到第一個捕獲組的值的最後的正則表達式跑去。 –
我最後一個正則表達式中的第一個捕獲組會運行什麼? – Graham
捕獲組是括號('()')。所以,這將是'(。+)'。在你的情況下,'[]'裏面的文字。 –