UUIDのJava正規表現 質問する

UUIDのJava正規表現 質問する

以下の形式のUUIDを持つ文字列を解析したい

"<urn:uuid:4324e9d5-8d1f-442c-96a4-6146640da7ce>"

以下のように解析してみましたが、うまくいきましたが、遅くなると思います。

private static final String reg1 = ".*?";
private static final String reg2 = "([A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12})";
private static final Pattern splitter = Pattern.compile(re1 + re2, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);

もっと速い方法を探して以下を試してみましたが、一致しませんでした

private static final Pattern URN_UUID_PATTERN = Pattern.compile("^< urn:uuid:([^&])+&gt");

私は正規表現の初心者です。どんな助けでもいただければ幸いです。

\アキュラ

ベストアンサー1

より高速な正規表現の例では、<入力が である&lt;ため混乱を招きます。

速度に関しては、まず、UUID は 16 進数なので、A-Zではなく に一致させますa-f。次に、大文字と小文字が混在していることが示されていないので、大文字と小文字を区別せずに使用せず、範囲内で正しい大文字と小文字を記述してください。

UUID の前の部分が必要かどうか説明されていません。必要でない場合は、 を含めないでください.*?。また、 で と のリテラルを一緒に記述することもできますre1。DOTALLre2final Pattern必要であることも示されていません。

private static final Pattern splitter =
  Pattern.compile("[a-f0-9]{8}(?:-[a-f0-9]{4}){4}[a-f0-9]{8}");

あるいは、正規表現のパフォーマンスが遅すぎると測定している場合は、別のアプローチを試してみるとよいでしょう。たとえば、
各uuidの前には例のように「uuid:」が付いていますか?付いている場合は、次のようにします。

  1. 「uuid:」の最初のインデックスを見つける、 それから
  2. 部分文字列0から+5 [必要だと仮定した場合]、そして
  3. 部分文字列+5 から正しく数えれば +41 (長さ 36 文字)。

同様に、より高速な正規表現は次のようになります。

private static final Pattern URN_UUID_PATTERN =
    Pattern.compile("^&lt;urn:uuid:(.{36})&gt;");

一方、入力文字列がすべてそれらの文字で始まる場合は、前の提案のステップ1を実行する必要はありません。input.substring(13, 49);

おすすめ記事