5

文字列がありますString s = "first.second.third...n-1.n";

2 つの正規表現アプローチのうち、Java でより効率的なのはどれですか?

s = s.replaceFirst(".*?\\.", "");

また

s = s.replaceAll('^[^.]+[.]', '');

彼らは同じことをしますが、どちらが速いのだろうか?

違いは次のとおりです。

  1. 固定正規表現を使用する vs.replaceFirst()最初のインスタンスのみに一致する

  2. 貪欲*?でない文字クラスとドット以外の文字クラスの使用[^.]

  3. \\.リテラルと[.]文字クラスの使用。

それらのパフォーマンスへの影響を個別にベンチマークまたは説明する回答を希望します。

4

1 に答える 1

4

2番目の正規表現はバックトラックしないため、より効率的です。

詳細を説明する素敵な記事へのリンクは次のとおりです。記事はどのように表現を説明します

<.*?>

式が25ステップかかります

<[^>]*>

文字列内で一致を見つけるのに5回しかかかりません<0123456789>。これは、一致を生成するために正規表現エンジンが実行する必要のある各ステップを示しています。

\\.との間に違いはないはずです[.]-優れた正規表現エンジンは、両方の部分式を同じコンパイル済み式に変換します。

アンカー付きバージョンは、ドットが文字列の最初の文字である場合に一致するものを見つけられないため、アンカーなしバージョンとreplaceAll同じことをしていません。これは、に置き換えることで修正できます。replaceFirst.+*

この違いが邪魔にreplaceAllならないようにすると、他に一致するものがないことを確認するためにもう少し時間がかかります(式が固定されているため、一致しません)が、最初の実行が長く、ドット。

于 2012-08-31T16:21:57.110 に答える