小编use*_*599的帖子

用户名的正则表达式会增加CPU消耗

我们的用户名验证有以下规则:

  • 用户名可以包含字母数字字符
  • 用户名可以有下划线,连字符或句点
  • 现在假设用户名是ASCII
  • 用户名无法以句点开头或结尾
  • 用户名无法启动,结束或有任何空格

我们有以下正则表达式:

^(([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)

java regex

8
推荐指数
1
解决办法
271
查看次数

标签 统计

java ×1

regex ×1