java8正则表达式匹配很慢

时间:2018-06-18 06:09:23

标签: java regex string performance

我有一个正则表达式^[a-z]+([a-z0-9-]+)*[a-z0-9]+$进行验证。

String src = "alfjaldfjaldmflajdflakclaldkfjaldjlad,fl.adc.aldjfal";
src.matches("^[a-z]+([a-z0-9-]+)*[a-z0-9]+$");

但是,匹配没有回应。 你知道快速正则表达式吗?

2 个答案:

答案 0 :(得分:2)

详细说明@OldCurmudgeon提供的答案

Pattern pattern = Pattern.compile("^[a-z][a-z0-9-]*[a-z0-9]$");
String src = "alfjaldfjaldmflajdflakclaldkfjaldjlad,fl.adc.aldjfal";
long start = System.nanoTime();
src.matches("^[a-z]+([a-z0-9-]+)*[a-z0-9]+$");
long end1 = System.nanoTime();
src.matches("^[a-z]+[a-z0-9-]*[a-z0-9]+$");
long end2 = System.nanoTime();
src.matches("^[a-z][a-z0-9-]*[a-z0-9]$");
long end3 = System.nanoTime();
pattern.matcher(src).matches();
long end4 = System.nanoTime();
System.out.println((end1 - start)/1000);
System.out.println((end2 - end1)/1000);
System.out.println((end3 - end2)/1000);
System.out.println((end4 - end3)/1000);

输出,以微秒为单位

14377
1130
190
112

以下非正则表达式方法只需10微秒。

private static boolean matches(String str)
{
    if (str.length() < 2)
    {
        return false;
    }
    char first = str.charAt(0);
    if (!(first >= 'a' && first <= 'z'))
    {
        return false;
    }
    char last = str.charAt(str.length() - 1);
    if (!(last >= 'a' && last <= 'z') && !(last >= '0' && last <= '9'))
    {
        return false;
    }
    for (int i = 0; i < str.length() - 2; i++)
    {
        char ch = str.charAt(i + 1);
        if (!(ch >= 'a' && ch <= 'z') && !(ch >= '0' && ch <= '9') && ch != '-')
        {
            return false;
        }
    }
    return true;
}

答案 1 :(得分:1)

您的问题出在此处:([a-z0-9-]+)*

您正在尝试匹配一次或多次x 0次或以上。这没有意义。

请改为([a-z0-9-]+)([a-z0-9-]*),以符合您的要求。

此外 - 您可以使用以下方式编译模式:

Pattern compiled = Pattern.compile(regex);

这可能有所帮助,但不是你的问题。