2011-11-16 4 views
6

"_"とピリオド "のマッチング方法を教えてください。 excatly regexを使って文字列に1回、regex式の代わりにindexOf()を使うとより効率的です。Javaの正規表現とindexOfとの比較

String s= "Hello_Wor.ld" or 
s="12323_!£££$.asdfasd" 

bascially任意の文字のNOが前に来ることができると_.後唯一の要件は、文字列全体が唯一の_.

+0

あなたは、どの方が読みやすく、意思を理解して維持しやすいのかをもっと気にする必要があります。ほとんどの論理的なケースでは、 'regex'は直線一致の場合にこの考慮を失います。 –

答えて

7

indexOfの1つのoccuranceが、正規表現よりもはるかに速くなります含めるべきであるということですおそらく理解しやすくなります。

indexOf('_') >= 0の場合は、次にindexOf('_', indexOfFirstUnderScore) < 0の場合はテストしてください。その期間も同じことをしてください。

private boolean containsOneAndOnlyOne(String s, char c) { 
    int firstIndex = s.indexOf(c); 
    if (firstIndex < 0) { 
     return false; 
    } 
    int secondIndex = s.indexOf(c, firstIndex + 1); 
    return secondIndex < 0; 
} 
+0

はい、もちろんです。訂正してくれてありがとう。 –

+0

私の答えを安全に削除できるようになりました! :) –

2

は、単一.での文字列にマッチします:

_のための同じ
/^[^.]*\.[^.]*$/ 

/^[^_]*_[^_]*/ 

組み合わせた正規表現のようなものでなければなりません:

/^([^._]*\.[^._]*_[^._]*)|([^._]*_[^._]*\.[^._]*)$/ 

indexOfがより良い解決策であることは明らかです。ボトルネックであることがわかるまでは、パフォーマンスは関係ありません。

もし興味があれば、「_の前に単一の.の文字列」とその逆の2つの用語がどのように組み合わされた正規表現に含まれているかに注意してください。それは3つの文字のために6つを持ち、n! nのために。組み合わせ正規表現を使用するよりも、正規表現とANDの両方を実行するほうが簡単です。

正規表現を使用しているときには、より簡単な解決策を探す必要があります。