我有以下模式要检查任何文本:
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
它基本上和我之前建议的正则表达式相同,我只是添加了更多的空格.