2016-04-27 11 views
0

私はCSVパーサーを作成していますが、ファイルにアクセスできると期待できるさまざまなデータ型を検出するために、それぞれの正規表現私は有効で認識可能であると定義した。例えば、私の整数値のために、ここに私の地図である:今代数を使用するときの正規表現効率と単正規表現

Map<String, String> integerFormatRegexps = new HashMap<String, String>(); 
integerFormatRegexps.put("^[1-9]\\d{1,9}$", "##0"); 
integerFormatRegexps.put("^-[1-9]\\d{1,9}$", "-##0"); 
integerFormatRegexps.put("^0$", "0"); 

、私は、私は、どこの代わりに3つの正規表現で、SO代わりにこれらの正規表現を分離有していると、彼らは交替を使用する場所で、ここでいくつかのexamplesを見てきました

Map<String, String> integerFormatRegexps = new HashMap<String, String>(); 
integerFormatRegexps.put("^[1-9]\\d{1,9}$|^-[1-9]\\d{1,9}$|^0$", "Integer"); 

Javaでパターンを一致させるとき、2つの方法のどちらがより効率的になるのでしょうか?マッチを見つけるために別のより単純な正規表現を反復するか、ただ1つ、より複雑な正規表現とマッチングするか?

+3

あなたは両方のバリアントを自分でベンチマークできないのはなぜですか? –

+1

これはPerlの[似たような質問]です(http://stackoverflow.com/questions/36420517/is-it-faster-to-use-alternation-than-subsequent-replacements-in-regular-expressi)。 *概要*:**あなたはリンゴとオレンジを比較していることに注意してください**。 –

+0

@ Washtorによって参照されているものを含めて、ここの他の投稿のLashane(これは非常に特定のトピックのようであり、多くの経験を必要とするようです)実際に私はそれを自分で測定することができました。私は例を提供しようとしたので非常に具体的ですが、それは名前が意味するように一般的な質問です:Java正規表現マッチングで交替のパフォーマンスを使用するでしょうか? – carlossierra

答えて

1

まず、効率性があなたにとって問題になることはまずありません。あなたの正規表現は比較的シンプルで、抽出された後に、それらの値を孤立して値にマッチさせるために使用しているようです。

言い換えれば、交互に注意することは、異なるブランチが同じ文字と一致することができるということです。これの最も良い例は(.|\s)で、DOTALL/Singlelineモード(または[\S\s]this questionのように)についてまだ分かっていない正規表現の初心者によって使用されることがあります。そうでなければ良性の正規表現の真ん中に置き、それを使ってそれほど大きなテキストではないものを検索し、コンピュータが緊張しているのを見ます。

すべてのブランチが異なるもの([1-9]-、または0)から開始する必要があるため、サンプル正規表現は問題ありません。しかし、私が言ったように、私は正規表現の効率が今までには懸念されるとは思わない。もっと便利だと思いますか?よりコンパクトなコードであり、より少ない数の正規表現は、より大きい、維持しにくい正規表現に対して妥当なトレードオフですか?

さらにもう1つ:厳密なループで正規表現を繰り返し使用している場合は、必ずキャッシュされたパターンオブジェクトを使用してください。それらをコンパイルするコストは重要です。実際には、文字列ではなくパターンとしてMapに格納することを検討してください。例:

Pattern integerRegex = Pattern.compiile("^[1-9]\\d{1,9}$|^-[1-9]\\d{1,9}$|^0$"); 

Map<String, String> integerFormatRegexps = new HashMap<String, String>(); 
integerFormatRegexps.put(integerRegex, "Integer"); 

次に、スタティックPattern.matches()メソッドを使用してチェックを実行できます。

+0

答えの最後の部分についていくつかのサンプルコードを共有してください。 – carlossierra