8

ユーザー名の検証には次のルールがあります。

  • ユーザー名には英数字を使用できます
  • ユーザー名にはアンダースコア、ハイフン、またはピリオドを使用できます
  • ここでは、ユーザー名が ASCII であると仮定します。
  • ユーザー名の最初または最後にピリオドを付けることはできません
  • ユーザー名の先頭、末尾、またはスペースを含めることはできません

同じものに対して次の正規表現があります。

^(([a-zA-Z0-9]+[_-]*[a-zA-Z0-9]*)([\\.]*[a-zA-Z0-9])*)+$

特定の文字列を照合しようとすると、CPU 使用率が指数関数的に増加します。例:

M45766235H.M96312865E@EXAMPLE.COM

明らかに、上記のような文字列の一致はすぐに失敗するはずですが、なぜそれほど多くの CPU サイクルがかかるのか知りたいです。最終的なコード:

import java.util.regex.*;
public class R {
    static final Pattern namePattern = Pattern.compile("^(([a-zA-Z0-9]+[_-]*[a-zA-Z0-9]*)([\\.]*[a-zA-Z0-9])*)+$");

    public static void main(String... args) {
        final String userName = "M45766235H.M96312865E@EXAMPLE.COM";
        Matcher matcher = namePattern.matcher(userName);
        System.out.println(matcher.matches());
    }
}

別の行で、正規表現を以下のように書き直しましたが、うまくいきます。

^[\\w]+[\\w-_\\.]*[\\w]+$
4

1 に答える 1