2016-09-07 21 views
2

JavaScriptで文字列を解析しようとしていて、ユニークな単語をすべて見つけようとしています。ユニークな単語は:という記号で始まります。RegExユニークな単語を見つける

"test :one :one test :one test :two".match(/(:[A-z]\w+)(?!.*\1)/g) 

そして単語は改行シンボルを行く後の場合、結果は、[':one', ':two']Online example #1

です。しかし:それはこの文字列の罰金に動作し

/(:[A-z]\w+)(?!.*\1)/g 

:私は、この目的のために、正規表現と書きました

"test :one\n :one test :one test :two".match(/(:[A-z]\w+)(?!.*\1)/ig) 

正規表現が正常に動作せず、返ります[':one', ':one', ':two']Online example #2

この正規表現を変更してユニークな結果しか得られないのですか?

+1

'[A-Z]' vs '[A-Z]' – Tushar

+0

@Tushar、thx、これを修正します – D0dger

答えて

3

あなたは(Why is this regex allowing a caret?を参照)のチェックが文字列(だけでなく、ライン)、代わりに[A-z][a-zA-Z]の終わり限り行くことを確認するために、代わりに.[\s\S]を使用する必要があります。

/(:[a-z]\w+)(?![\s\S]*\1)/gi 

regex demo

var re = /(:[a-z]\w+)(?![\s\S]*\1)/gi; 
 
var str = 'test :one\n :one test :one test :two'; 
 
console.log(str.match(re)); 
 
//or, get rid of the inital : 
 
console.log(str.match(re).map(function(x){return x.substr(1);}));

を参照してください。
+0

もし必要なら、最初の ':' sを取り除くためのコード行を追加しました。確かにそれは内部のキャプチャグループで行うことができますし、 'RegExp#exec'との一致を繰り返しますが、なぜあなたのコードを再利用しないのですか? –

+0

はい、便利です – D0dger

関連する問題