0

/(everything|cool)/giこの正規表現:とこれの違いは何ですか: /(?:everything|cool)/gi

自分で書くことができなかった正規表現があるので、これを求めています*。以下に示すように?:、その正規表現には多くの正規表現があります。パフォーマンスに悪いところを読んだ?:ので削除したいのですが、削除できますか、それとも何か重要ですか?

*(?:(?=(?:(?:\\.|"(?:\\.|[^"\\])*"|[^\\'"])*'(?:\\.|"(?:\\.|[^"'\\])*"|[^\\'])*')*(?:\\.|"(?:\\.|[^"\\])*"|[^\\'])*$)(?=(?:(?:\\.|'(?:\\.|[^'\\])*'|[^\\'"])*"(?:\\.|'(?:\\.|[^'"\\])*'|[^\\"])*")*(?:\\.|'(?:\\.|[^'\\])*'|[^\\"])*$)(?:\\.|[^\\'"]))+

4

3 に答える 3

4

(?:...)結構です。グループ、特にグループへの後方参照をキャプチャするときに、パフォーマンスの低下が見られるようになります。

于 2012-04-15T17:39:18.333 に答える
4

がない?:場合、一致したグループへの参照が作成されます。
を使用する?:と、グループは一致しますが、キャプチャされません。

両方の方法のベンチマークは次のとおりです。http://jsperf.com/regex-capture-vs-non-capture

バーを見ると、キャプチャされていないグループの方が速いと言えます。ただし、下部を見ると、どちらの方法もすでに信じられないほど高速であるため、違いは無視できます。

既存のソリューションを削除または追加?:するとコードが破損する可能性があるため、問題が発生しない場合はRegExpを編集しないことをお勧めします。

于 2012-04-15T17:39:22.660 に答える
2

(foo)あなたはそれがより遅いと聞いたはずです(?:foo)。これは、最初のグループがキャプチャグループであり、2番目のグループが非キャプチャグループであるためです。2つ目は、実行する作業が少ないため(一致したテキストを覚えておく必要がないため)、高速になるはずです。

于 2012-04-15T17:41:10.083 に答える