java中的正则表达式模式只与一个特定的文本崩溃

我有以下模式要检查任何文本:

public static boolean endWithLinkOrHashAt(String commentstr)
{
    String urlPattern = "^[@|#]((?:\\w+\\s?){1,}).*:\\s[^?]?((?:\\w+\\s?){1,})[^?]((?:http|https):\\/\\/\\S+)(\\s[@|#]\\w+){0,}[^?]$";
    Pattern p = Pattern.compile(urlPattern,Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(commentstr);
    if (m.find()) {
        System.out.println("yes");
        return true;
    }
    return false;
}

现在,当我尝试使用以下文本时,程序没有做任何事情,控制台永远运行,没有任何结果或任何错误:

endWithLinkOrHashAt("#BREAKING: @Baird resigning in aftermath of controversial win over @pmharper in game of #Trouble (with the pop-o-matic bubble) #cdnpoli");

我的正则表达式有什么问题(但它适用于其他文本,似乎只有这个特定的文本有问题)

更新:

这是我想要检查的模式:

@ or # + 1 or 2 words + : + 1 words or more + link + nothing or any words that has # or @ at the beginning

最佳答案 你的正则表达式的问题似乎是它导致了灾难性的回溯.它是嵌套量词的根本原因.

我建议使用更线性的正则表达式:

(?i)^[@#](\\S+(?:\\s+\\S+)?)\\s*:\\s*(\\S+(?:\\s+\\S+)*)\\s*(https?://\\S*)((?:\\s+(?=[#@])\\S+)*)\\s*$

demo

它基本上和我之前建议的正则表达式相同,我只是添加了更多的空格.

点赞