2009-07-17 40 views
1

我發現了下面的表達式,用於修改克隆的html元素的id,例如改變contactDetails[0]contactDetails[1]幫助解釋一個javascript正則表達式

var nel = 1; 
var s = $(this).attr(attribute); 
    s.replace(/([^\[]+)\[0\]/, "$1["+nel+"]"); 
    $(this).attr(attribute, s); 

我並不十分熟悉的正則表達式,但試圖解釋它,並用The Regex Coach幫助不過我還在掙扎。看起來([^\[]+)匹配一個或多個不是'['的字符和\[0\]/匹配[0]。中間的/我解釋爲'包含兩個',所以我不明白爲什麼作者甚至包含了第一個表達式。

我不明白什麼替換字符串中的$ 1,如果我使用正則表達式教練替換功能,如果我只是使用[0]作爲搜索和1作爲替換我得到正確的結果,但是,如果我更改javascript到s.replace(/\[0\]/, "["+nel+"]");字符串s保持不變。

感謝您對原創作者的意圖給予的任何建議,並幫助您找到解決方案,該解決方案將成功替換搜索字符串中任何位置的方括號中的數字。

回答

2

查找

/   # Signifies the start of a regex expression like " for a string 
([^\[]+) # Capture the character that isn't [ 1 or more times into $1 
\[0\]  # Find [0] 
/   # Signifies the end of a regex expression 

更換

"$1["  # Insert the item captured above And [ 
+nel+  # New index 
"]"   # Close with ] 

要創建捕獲任何數字表達式,你可以替換\d+0這將1次或多次匹配一個數字。

s.replace(/([^\[]+)\[\d+\]/, "$1["+nel+"]"); 
2

$1是對正則表達式中第一組的反向引用。組是()中的部分。因此,在這種情況下,$1將被([^\[]+)部分匹配。

如果字符串爲contactDetails[0],則生成的字符串將爲contactDetails[1]

請注意,這個正則表達式只能替換方括號內的0。如果你想更換任何號碼,您需要類似:

([^\[]+)\[\d+\] 

\d匹配任何數字字符。然後\d+成爲至少一個數字的任何序列。

但是你的代碼仍然不行,因爲Javascript字符串是不可變的。這意味着它們一旦創建就不能更改。 replace方法返回一個新的字符串,而不是更改原來的字符串。你應該使用:

s = s.replace(...) 
+0

謝謝,我現在明白了,因此明白這應該是工作,但事實並非如此。我已經提取了這段代碼,並改變了設置var s = ContactData [0],我已經把它放到腳本塊中的vanila html文件中,但是在替換s沒有改變之後。任何想法發生了什麼? – Richbits 2009-07-17 14:06:55

+0

當你說`s = ContactData [0]`時,你的意思是`s =「ContactData [0]」`對嗎?它的內容是「ContactData [0]」而不是「ContactData [0]`數組的索引0處的值? – 2009-07-17 14:12:31

1

看起來它替換的0陣列,1

例如:   數組[0]變爲陣列[1]

說明:

([^ [] +) - 這部分意味着保存所有不是[變量$ 1
[0123]/        - 這部分限制第1部分以將所有內容保存到[0]

「$ 1 [」+ nel +「]」 - 打印出$ 1的內容(從第1部分加載)並添加括號內的值nel。 (在你的例子中nel = 1)

0

方括號定義了一組匹配的字符。 [abc]將匹配字母a,b或c。

通過添加克拉,您現在指定您希望字符不在集合中。 [^abc]將匹配任何不是a,b或c的字符。

因爲方括號在RegExps中有特殊含義,所以如果你想匹配一個斜槓,你需要用斜線將它們轉義。 [開始一個字符集,\[匹配一個大括號。 (與花括號相同的概念)

因此,[^\[]+可捕獲1個或多個不是[的字符。

包裝,在括號「抓住」的字符串匹配的部分(在這種情況下「contactDetails」,這樣就可以在替換使用它。

$1使用「捕獲的」字符串(即「contactDetails」 )在替換字符串。

0

此正則表達式「東西」,然後一個[0]
「東西」是由表達[^\[]+確定其是不是[所有本地字符匹配匹配。你可以看到()解決此表達式,因爲匹配會在$ 1以後重用餘下的正則表達式 - 即\[0\]與索引[0]匹配。作者必須編寫\[\],因爲[和]是正則表達式的特殊字符,必須轉義。

0

$ 1是對第一個pants對的值的參考。在箱子

[^\[]+ 

相匹配的一個或多個字符,而它們不是「[」

正則表達式的其餘部分相匹配的字符串的值「[0]」。

因此,如果s是'foobar [0]',結果將是'foobar [1]'。

0

[^\[]將匹配任何非[的字符,「+」表示一次或多次。所以[^ [] +會匹配contactDetails。括號將捕獲這個供以後使用。 '\'是一個轉義符號,所以末尾\[0\]將匹配[0]。替換字符串將使用$ 1,這是在括號中捕獲的並添加新索引。

0

您對正則表達式的解釋是正確的。它旨在匹配一個或多個不是[的字符,後面跟着文字[0]。並且在replace方法中使用,匹配將被替換爲第一組的匹配(這就是$1被替換)和序列[,隨後是nel](這是如何解釋"$1["+nel+"]"的方式)。

再次,一個簡單的s.replace(/\[0\]/, "["+nel+"]")也是這樣。除非[0]前沒有任何內容,因爲在這種情況下,第一個正則表達式不會找到匹配項。