2011-10-21 13 views
2

私の質問を見てくれてありがとう。正規表現の代替(すべての一致)

私は正規表現に一致しようとしている選択肢の長いリストを持っている:

var re = new RegExp('o1|o2|o3|o4|o5|...','g')

私はに実行し、問題がO1はO2の部分文字列であれば何が起こるかです。例えば

var re = new RegExp('a|b|c|ab|abc','g')

var s = 'abc'

s.match(re) - > "A"、 "B"、 "C"]

また、「ABと一致できるようにするため、私は希望

"と" abc "。 RegExpの順序を変更すると、長い文字列と一致するようになりますが、本当にすべての一致を取得したいと思います。

これを行うにはどのような方法が最適ですか?これは必ずしも長いリストの選択肢を扱う最良(または良い方法)のようには思えません。私は独自の正規表現を使って各選択肢をテストすることを考えましたが、それはあまり効率的ではないようでした。

どのような指針も素晴らしいでしょう。ありがとう!

+0

だから、あなたは、すべての可能な一致をしたいですこれらの代替案?私はそれが表現だけでは不可能だとは思わない。 –

+0

はい、そうです。私は過去にこのソリューションを使用しましたが、重複のないオプションのリストがあり、独自のregexpまたはindexOfを使用して各オプションをチェックするよりも速いようでした。私は代わりの候補が重複している可能性があるので、リストを繰り返し処理する必要があると思います: -/ – bobjenkins1234

答えて

1

RegExpで選択肢のリストが長い場合は、indexOfの方法をStringとするとよいでしょう。ここでは、文字列内のすべての選択肢のインデックスを出力コードは次のとおりです。

var alternatives = ['a', 'b', 'c', 'ab', 'abc'], 
    s = 'abc, cba', 
    i, 
    index; 

for (i = 0; i < alternatives.length; i++) { 
    index = -1; 
    do { 
     index = s.indexOf(alternatives[i], index+1); 
     if (index !== -1) { 
      console.log(alternatives[i], index); 
     } 
    } while (index !== -1); 
} 
+0

それぞれの代わりに 'indexOf'を実行し、マッチを追跡しますか? – bobjenkins1234

+0

@ bobjenkins1234コードを追加しました。 – bjornd

+0

indexOfは voigtan

0

あなたは​​のような文字列全体にマッチしようとした場合、その後Rgexは次のようになります。

^(a|b|c|ab|abc)$ 

しかし、簡単には多分ありしかし、あなたを助けるために、私はあなたが確認したいすべての "選択肢"を知る必要があります。おそらく短い正規表現が可能です。

0

あなたはすべての一致を得るために、セットアップ複数(capturing groups)ができた...あなたはまだあなたの例を使用してそれに応じて

をあなたの選択肢を注文する必要があります。

var re = /((a)(b))(c)|(a)(b)|a|b|c/ 
var s5 = 'abc'; 
var s4 = 'ab'; 
var s3 = 'a'; 
var s2 = 'b'; 
var s1 = 'c'; 

console.log(s5.match(re)); // ['abc', 'ab', 'a', 'b', 'c', undef, undef] 
console.log(s4.match(re)); // ['ab', undef, undef, undef, undef, 'a', 'b'] 
console.log(s3.match(re)); // ['a', ... undef x 6 ...] 
console.log(s2.match(re)); // ['b', ... undef x 6 ...] 
console.log(s1.match(re)); // ['c', ... undef x 6 ...] 

More info on capturing groups