我们的用户名验证有以下规则:
我们有以下正则表达式:
^(([a-zA-Z0-9]+[_-]*[a-zA-Z0-9]*)([\\.]*[a-zA-Z0-9])*)+$
Run Code Online (Sandbox Code Playgroud)
现在尝试匹配特定的字符串,CPU使用率呈指数级增长.例如:
M45766235H.M96312865E@EXAMPLE.COM
Run Code Online (Sandbox Code Playgroud)
显然,匹配像上面的字符串应该立即失败但我想知道为什么它需要那么多的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());
}
}
Run Code Online (Sandbox Code Playgroud)
在不同的路线上,我重写了下面的正则表达式并且很好地展示了它:
^[\\w]+[\\w-_\\.]*[\\w]+$
Run Code Online (Sandbox Code Playgroud)