1

グループ化括弧が()あり(?: )、括弧内の式が一致しない場合でも一致する必要があります。私は両方を見て、これ(つまりと)に使用しましたが、どちら|を使用する必要があります/より効率的ですか、そしてなぜですか??(a|b|c|)(a|b|c)?

JavaScriptエンジンが異なれば正規表現の解釈も異なるため、私は特にSpiderMonkeyエンジンを使用しています。ただし、一般化された(言語とエンジンの両方の)答えがあれば便利です。

編集:具体的な例は、DuckDuckGoFrequencygoodieです。この場合、なぜ作者が選ん|?のですか?

4

2 に答える 2

1

パフォーマンスを確認するには、この fiddleを参照してください。


?オプションとしてwith grouping またはwith empty stringを使用すると|、予期しない結果になる可能性があります!

カップル テスト:

var myString = "this is a test string"; 
var myRegexp = /(test)?/; 
var match = myRegexp.exec(myString); 
alert(match[0]); // returns empty string

var myString = "this is a string"; 
var myRegexp = /(test)?/; 
var match = myRegexp.exec(myString); 
alert(match[0]); // returns empty string

var myString = "this is a test string"; 
var myRegexp = /(test|)/; 
var match = myRegexp.exec(myString); 
alert(match[0]); // returns empty string

var myString = "this is a string"; 
var myRegexp = /(test|)/; 
var match = myRegexp.exec(myString); 
alert(match[0]); // returns empty string

var myString = "this is a test string"; 
var myRegexp = /(test)/; 
var match = myRegexp.exec(myString); 
alert(match[0]); // returns "test"

これはエラーで終了します:

var myString = "this is a string"; 
var myRegexp = /(test)/; 
var match = myRegexp.exec(myString); 
alert(match[0]); // error

そして、これはあなたのための解決策かもしれません:

var myString = "this is a test string"; 
var myRegexp = /^(?:.*(test)|(?!.*test))/; 
var match = myRegexp.exec(myString); 
alert(match[1]); // returns "test"

var myString = "this is a string"; 
var myRegexp = /^(?:.*(test)|(?!.*test))/; 
var match = myRegexp.exec(myString); 
alert(match[1]); // returns undefined

この fiddleで上記のコードをテストします。

于 2012-10-14T23:28:00.190 に答える
1

あなたの説明から、適切な選択は?量指定子であると思われます。これにより、括弧間の前のグループをオプションで直接一致させることができます。

一方、一連のパターンのうちの 1 つ|を一致させたい場合に使用されます。

于 2012-10-14T23:07:08.597 に答える