2013-03-05 3 views
5

私はいくつかのコードのパフォーマンスを向上させようとしています。文字列が正規表現でないかどうかを確認するにはどうすればよいですか?

public boolean isImportant(String token) { 
    for (Pattern pattern : patterns) { 
     return pattern.matches(token).find(); 
    } 
} 

私が気づいたことは、多くのパターンが正規表現構文のない単純な文字列リテラルであるように見えることです。特定の文字列がありませんが含まれている場合

public boolean isImportant(String token) { 
    if (importantList.contains(token)) return true; 

    for (Pattern pattern : patterns) { 
     return pattern.matches(token).find(); 
    }   
} 

をどのように私はプログラム的に決定します:だから私は、次のような、単に別のリスト(importantList)でこれらを格納し、代わりに、より高価なパターンマッチを実行するの平等のテストをしたいです正規表現の構文?

編集: 回答にパフォーマンスを重視する必要はありません。 (すなわち、正規表現を使用することができます)私は主にisImportant()のパフォーマンスに関心があります。なぜなら、パターンの初期化は1回だけ行われるのに対し、何百万回も呼び出されるからです。

+1

正規表現であるかどうかを判断するために文字列に正規表現を使用しないで、各文字列を正規表現として使用するよりもはるかに悪くなるでしょうか? –

+3

@MikeM:それは彼が求めているものではありません。 'hello'は完全に有効な正規表現です。 –

+0

普通の文字列リテラルでパターンを見つけない限り、簡単ではないか、価値がありません。単純な文字列リテラルは有効な正規表現パターンです。 – AC1

答えて

3

これは難しいでしょう。正規表現メタキャラクタが存在しないことを確認できます。それはよい近似でなければなりません:

それは価値があるかどうかは別の質問です。正規表現のマッチがリストのルックアップよりも遅いことは確かですか?(とにかく多くの場合、後で正規表現マッチを行うので特にそうです)?私は正規表現マッチを保つほうがはるかに速いと思う。

+0

これは私が行った解決策です。興味深いことに、私は処理時間を約50%短縮しました。 –

4

私は通常これを言う答えが嫌いですが、...

Do not do that。

おそらくコード実行が速くなるとは限りません。実際は、プログラムの実行に時間がかかることさえあります。

コードを実際に最適化する必要がある場合は、より効果的な場所を探し出すことができます。

+0

私は、プロファイラが最適化が意味を持つかどうかという質問に答えるつもりです。 –

2

正規表現のパターンは文字列以外のものであるため、これを特定する方法はありません。さらに、ほとんどが正規表現としてもパフォーマンスの違いは、今日、スマートではないと私は、パターンと元の長さが同じであれば、株式のチェックが行われますつまり最初で、かなり確信している

+1

それは依存しますが、私はJavaがはるかに効率的なDFA正規表現を最初に実行しようとしており、式が必要であればNFAにスワップするだけであることを推測します(たとえば、それにはルックアラウンドが含まれています) –

1

これは間違っている

for (Pattern pattern : patterns) 

すべてのパターンをORする1つの大きな正規表現を作成する必要があります。入力ごとに1回だけ一致します。

+0

ありがとう。私は実際にそれを行い、1つの巨大パターンを使用することは、複数の小さなパターンとのマッチングよりも約1/3速いことが判明しました。 –

関連する問題