以下の形式の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:([^&])+>");
私は正規表現の初心者です。どんな助けでもいただければ幸いです。
\アキュラ
ベストアンサー1
より高速な正規表現の例では、<
入力が である<
ため混乱を招きます。
速度に関しては、まず、UUID は 16 進数なので、A-Z
ではなく に一致させますa-f
。次に、大文字と小文字が混在していることが示されていないので、大文字と小文字を区別せずに使用せず、範囲内で正しい大文字と小文字を記述してください。
UUID の前の部分が必要かどうか説明されていません。必要でない場合は、 を含めないでください.*?
。また、 で と のリテラルを一緒に記述することもできますre1
。DOTALLre2
がfinal Pattern
必要であることも示されていません。
private static final Pattern splitter =
Pattern.compile("[a-f0-9]{8}(?:-[a-f0-9]{4}){4}[a-f0-9]{8}");
あるいは、正規表現のパフォーマンスが遅すぎると測定している場合は、別のアプローチを試してみるとよいでしょう。たとえば、
各uuidの前には例のように「uuid:」が付いていますか?付いている場合は、次のようにします。
- 「uuid:」の最初のインデックスを見つける私、 それから
- 部分文字列0から私+5 [必要だと仮定した場合]、そして
- 部分文字列私+5 から私正しく数えれば +41 (長さ 36 文字)。
同様に、より高速な正規表現は次のようになります。
private static final Pattern URN_UUID_PATTERN =
Pattern.compile("^<urn:uuid:(.{36})>");
一方、入力文字列がすべてそれらの文字で始まる場合は、前の提案のステップ1を実行する必要はありません。input.substring(13, 49);