我有一个正则表达式^[a-z]+([a-z0-9-]+)*[a-z0-9]+$
进行验证。
String src = "alfjaldfjaldmflajdflakclaldkfjaldjlad,fl.adc.aldjfal";
src.matches("^[a-z]+([a-z0-9-]+)*[a-z0-9]+$");
但是,匹配没有回应。 你知道快速正则表达式吗?
答案 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);
这可能有所帮助,但不是你的问题。