2017-07-14 7 views
2

正規表現を使用して、(非常に長い)文字列の中にいくつかのプロダクトコードを見つける関数に取り組んでいます。1つの大きな正規表現は、小さな正規表現よりも効率的ですか?

そのコードの多くの可能な形態は、たとえば、あります

UK[A-z]{10}またはDE[A-z]{20}またはPL[A-z]{7}か...

方が良いだろうどのような解決策?多くの(たぶんおそらく20-50くらいの)小さな正規表現や、それらにすべてマッチする1つの巨大なモンスター - 正規表現?パフォーマンスが関係している方が良いでしょうか?

+2

'(?:UK | DE | PL)[A-Za-z] {7、} 'のように、1つの正規表現で十分です。 '[A-z]'は使わず、 '['、 '' \ ''、 ']'、 '^'、 '_'と' \ ''にもマッチします。 –

+0

私は、これらのコードには非常に多様な形がたくさんあることを忘れています。短い正規表現でそれらをすべてキャプチャすることは不可能です。質問に与えられていることは単なる例にすぎません。 – maestromusica

+0

@WiktorStribiżew私が何を求めているかは、より多くのより小さな正規表現を使うべきか、それらを1つの巨大な正規表現に組み合わせるべきかということです。パフォーマンスは賢明です。 – maestromusica

答えて

3

あなたはどのような種類の大きな正規表現を書くかによって異なります。病理学的パターンで終わると、より小さなパターンを検査する方が良いでしょう。例:

UK[A-Za-z]{10}|DE[A-Za-z]{20}|PL[A-Za-z]{7} 

このパターンは非常に非効率的であることが交代で始まるので、これは最悪の場合(不一致)の各選択肢は文字列内の全ての位置についてテストする必要があることを意味します。

しかし、あなたはこのようなあなたのパターンを記述する場合:

(?=[UDP][KEL])(?:UK[A-Za-z]{10}|DE[A-Za-z]{20}|PL[A-Za-z]{7}) 

やバリエーション:

[UDP][KEL](?:(?<=UK)[A-Za-z]{10}|(?<=DE)[A-Za-z]{20}|(?<=PL)[A-Za-z]{7}) 

試合ができない位置のほとんどはすぐに交代前に廃棄されています。

また、単一のパターンを書き込む場合、明らかに文字列は1回のみ解析されます。

関連する問題