2011-11-14 20 views
1

"@word"のように@で始まる単語を取得しようとしていますが、 "word"値だけを取得しようとしています。regexグループに前の文字が含まれないようにしますか?

私のサンプルテキストは、次のとおりです。

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

私の現在の正規表現は次のとおりです。

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

これは、 "@" はまだ捕獲されていることを除いて、完璧に動作します。この一致の出力は次のとおりです:

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

@をバックリファレンスに設定しようとしましたが、まだ結果に@が含まれています。

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

FYI、*は@ *をキャプチャしていない*消費しています。非捕捉グループは、マッチのその部分に別の "ハンドル"を割り当てなくても、グループ化することができます。それはあなたが見ている全体的な試合の一部です。 *一致するものを消費しない(少なくとも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

私は、かゆみを感じるのか、そそるのかを決めることができません。とにかく+1。それは愉快なものです。 :D –

+0

@ AlanMoore - 私の防衛で:このトリックは、ジョン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

paulの答えを明確にするために、括弧のように正規表現にグループを取り込んだら、string.matchまたはregex.execは配列を返し、その配列の最初の結果は完全一致です。配列の次の要素はキャプチャグループです。 –

-2

から返さ使用するには、正規表現のを除き、追加の計算なしでより良いソリューションです:

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

LookbehindsはJavaScriptで動作しません。 – Geuis

+0

... lookbehindを使用する場合、キャプチャ括弧は必要ありません。 –

+0

見つかった文字列の配列がある場合、なぜ各文字列から最初のN文字を取り除くことができないのですか?Nは "@"または別の文字列の長さですか? – Gargolev

関連する問題