3

配列があり、「test」で始まる文字列を検索したい(たとえば); これらの設定されたプレフィックスを検索する最も効率的な方法は何ですか? 正規表現かif文か?

正規表現:

    boolean found = false;
    for (String line: ArrayList){
                Pattern pattern = 
                Pattern.compile("^test"); //regex

                Matcher matcher = 
                pattern.matcher(line);


                while (matcher.find()) {
                    found = true;
                }
                if(found){
                    doSomething();
                         } 
                    }
                }

if ステートメント:

for (String line : ArrayList) {
       if (line.startsWith("test"){
            doSomething();
            }

どれが最も効率的ですか?

長い文字列に最も効果的な方法はどれですか?

"test" で始まる文字列を検索し、"test" の後に "foo" がある文字列のみを検索する場合、どの方法が適していますか?

正規表現が答えである場合、「test」で始まり、「foo」または「bar」が続き、両方ではないという正しい構文は何ですか?

4

6 に答える 6

6

16行と比較して4行のコード? どちらが速く実行されるかは問題ではありません。4 行のバージョンの方が、記述が効率的で、保守も効率的です。

いくつかのコードがあり、それをベンチマークして特定のボトルネックを特定した場合は、より複雑にすることを検討してください。それ以外の場合は、毎回単純なバージョンを使用してください。

于 2012-07-12T15:04:16.407 に答える
5

を使用するだけstartsWithです。先頭にスペースがある文字列を受け入れたくない場合を除き、正規表現は少しやり過ぎです。

startsWith「test」または「testfoo」でも機能します。"foo"が後の入力のどこにでも現れる可能性があることを意味する場合"test"(つまり"testokokokfoonothing")、ここでは正規表現を使用する必要があります。

正規表現バージョンのコードは次のように短縮できます。

for (String line: ArrayList){
    if (line.matches("^test.*") {
        doSomething();
    }
}

matches()入力全体が正規表現と一致するかどうかを確認するため、正規表現を少し変更する必要があります。上記のコードは、Pattern再コンパイルされているため、若干遅くなります。

于 2012-07-12T15:03:17.313 に答える
2

正規表現はかなりのオーバーヘッドを引き起こします。「直接」実装があるものを実行している場合は、startsWithほとんどの場合、高速になります。

于 2012-07-12T15:03:24.300 に答える
1

私はIFステートメントが好きです。個人的には、可能であれば正規表現は避けます。それらは複雑になり、コーディングが難しくなります。コーディングに関して最も重要なことの 1 つは保守性ですが、正規表現はそれを提供しません。

if ステートメントにとどまります。

于 2012-07-12T15:03:17.003 に答える
1

startsWith() を優先する必要があります。これはより慣用的で簡潔であり、効率の悪い正規表現を比較的簡単に作成できるため、特に java.util.regex を使用すると、より高速に実装できる可能性は低くなります。

一般に、String オブジェクトの標準メソッドでは不十分な場合にのみ、java.util.regex を使用する必要があります。

正規表現コードに関するいくつかの注意事項。正規表現を他の目的で使用する場合、ループ内で Pattern.compile を実行しないでください。次のように言うことで、コードをさらに簡素化できます。

if (matcher.find()) {
    doSoemthing();
}
于 2012-07-12T15:08:08.197 に答える
0

yopuが最初にやらなければならないこと:コンパイルは時間を消費Pattern pattern = Pattern.compile("^test"); //regexするので外に出しforて、一度だけやらなければならない。

   Pattern pattern = Pattern.compile("^test.*"); //regex
   for (String line: ArrayList){
       if(patter.matches(line)){
            oSomething();
       }
   }
于 2012-07-13T06:56:48.253 に答える