2010-12-01 32 views
1

時不同的結果見http://jsfiddle.net/aEEUN/正則表達式:使用後向引用

爲什麼當我使用反向引用與未backrefences,我得到不同的結果?

var str = "Hello World\nHello   "; 
document.write("Without backreference: <br />"); 
var match = str.match(/\S(?![\s\S]*\S)/); 
document.write("- match.index: " + match.index + "<br />"); // index is 16 

document.write("With backreference: <br />"); 
var match = str.match(/(\S)(?![\s\S]*\1)/); 
document.write("- match.index: " + match.index); // index is 6 

回答

5

不同之處在於你限制兩個字符完全一樣。

在第一正則表達式必須不存在任何以下非空白字符:

/\S(?![\s\S]*\S)/ 

這基本上意味着,以匹配任何後面沒有任何其他非空白字符非空白字符。這就是爲什麼它會在最後o是隻跟空格匹配:

"Hello World\nHello   " 
       ^no other non-whitespace character following 

但在第二個正規表達式有不能是具體字符後面這是匹配之前:

/(\S)(?![\s\S]*\1)/ 

這基本上意味着匹配在字符串的其餘部分不再出現的任何非空白字符。這就是爲什麼W匹配,因爲它是不第一次出現後再次出現的第一個非空白字符:

"Hello World\nHello   " 
    ^no other 「W」 following 

這就是爲什麼它被稱爲反向引用:你引用先前匹配的字符串。

0

這是一些奇怪的正則表達式。角色類[\s\S]匹配所有不是嗎?空間還是非空間?不確定,但後一個例子中的\1必須引用它在開始時所做的相同字符(不再是任何非空格)......這會給它一個不同的結果。