2011-03-26 126 views
9

如果我在正則表達式中使用string.match(),我會找回匹配的字符串,但不會將匹配發生的原始字符串的索引取回。如果我做了string.search(),我得到了索引,但我不一定知道該字符串的匹配部分有多長。有沒有辦法做到這一點,所以我可以得到原始字符串匹配的結束的索引?找到正則表達式搜索/匹配的結束索引

我想我可以一個接一個(下面),假設他們以不同的方式返回相同的結果,但這看起來很醜並且效率低下,我懷疑還有更好的辦法。

var str = "Fear leads to anger. Anger leads to hate. Hate leads to suffering"; 

var rgx = /l[aeiou]+d/i; 
var match = str.match(rgx); 
if (match && match[0]) { 
    var i = str.search(rgx); 
    console.log ("end of match is at index " + (i+match[0].length)); 
    } 

回答

10

.match返回一個新的數組具有以下屬性:

索引屬性被設置爲匹配的子 的 位置完整的所述串內S.

輸入屬性設置爲S.

長度屬性設置爲n +1。

的0屬性被設置爲匹配的子串 (即的Offset S 的該部分之間我包容和偏移 ë排斥)。

對於每個整數i,例如i> 0和i < = n,請將名爲ToString(i)的屬性設置爲r的capture數組的第i個元素。

http://bclary.com/2004/11/07/#a-15.10.6.2

match.index將提供你所需要的。

+0

有趣....我已經注意到,Chrome把索引放在數組中(假設你沒有/ g ....這樣就會出現多個匹配,並且只有一個索引是沒有意義的) 。如果這被所有合理的瀏覽器支持(...?),那就完美了。 – rob 2011-03-26 20:51:57

0

或者:

if (match && match[0]) { 
    console.log ("end of match is at index " + (str.indexOf(match[0]) + match[0].length)); 
} 
+1

我想你是對的,如果你在match [0]上做了indexOf,它總是第一次出現。除非有一個奇怪的正則表達式,可能會讓你第二次出現一個字符串...? – rob 2011-03-26 20:47:13