2011-11-14 50 views
1

我試圖讓任何以@開頭的單詞,例如「@word」,但只能得到「單詞」的值。防止正則表達式組包含前一個字符?

我的示例文本是:

@bob asodija qwwiq qwe @john @cat [email protected] 

我現在的正則表達式是:

/\[email protected](\w+)/gi 

這完美的作品,除了 「@」 仍然被抓獲。這場比賽的輸出是:

"@bob" 
"@john" 
"@cat" 

我已經嘗試在後向引用中設置@,但其仍然包括結果中的@。

/\B(?:@)(\w+)/gi 
+0

僅供參考,它不*捕獲*,它*消耗*它。一個非捕獲組只允許你分組事件,而不必爲該比賽的那一部分分配一個單獨的「句柄」。它仍然是整體比賽的一部分,這就是你所看到的。 *沒有*消費它匹配的唯一類型(至少在JavaScript中)是前瞻性的 - 例如。 '(?= ...)'。 –

回答

2

下面是使用一個巧妙的String.replace方法,它可以作爲替換功能。

var matches = []; 
var str = "@bob asodija qwwiq qwe @john @cat [email protected]"; 

str.replace(/\[email protected](\w+)/g, function(all, firstCaptureGroup) { 
    matches.push(firstCaptureGroup); 
}); 
console.log(matches); //["bob", "john", "cat"] 
+0

我無法決定是否會發癢或感到震驚。無論如何這是一種樂趣,令人震驚。 :D –

+0

@AlanMoore - 在我的防守中:這個技巧不在John Resig之下http://ejohn.org/blog/search-and-dont-replace/ – meouw

5

您要使用的匹配陣列從exec

var teststr = '@bob asodija qwwiq qwe @john @cat [email protected]'; 
var exp = /\[email protected](\w+)/gi; 

var match = exp.exec(teststr); 
while(match != null){ 
    alert(match[1]); // match 1 = 1st group captured 
    match = exp.exec(teststr); 
} 
+0

爲了闡明保羅的答案,如果你的正則表達式中有捕獲組,比如parens,string.match或regex.exec將返回一個數組,並且該數組的第一個結果是完全匹配。數組中的下一個元素是捕獲組。 –

-2

這裏不進行額外的計算一個更好的解決方案,除了正則表達式返回:

(?<=\[email protected])(\w+) 
+3

Lookbehinds在JavaScript中不起作用。 – Geuis

+0

...並且如果您使用後視,則不需要捕獲括號。 –

+0

所以如果你有一個找到的字符串數組,爲什麼不能簡單地從每個字符串中刪除N個第一個字符,其中N是你的「@」或另一個字符串的長度? – Gargolev

相關問題