我的程序在某个点上挂起字符串可能是因为正则表达式中的无限循环。
我的字符串值是
String input="The contents of this Office Memorandum may also be brought to the notice";
我的代码是
String pat = "(the|The)[ ]?((([A-Za-z0-9])+([ ]| , )?([A-Za-z0-9]))+ [ ]?)+([<][ ]?[A-Za-z0-9- ]+ [,]?[A-Za-z0-9- ]+[ ]?[>])*[ ]?(Act|Rules|Rule|Bill|Regulations)[ ]?[,]?[ ]?([0-9]+)?";
Pattern p = Pattern.compile(pat);
Matcher m = p.matcher(input);
while (m.find()) {
String sMatch = m.group();
String temp1=sMatch;
String temp2=sMatch;
}
它在循环中运行,但不是从循环中出来的。我觉得regex有点问题。我不明白-有什么问题?
有什么能帮我解决的。
当调试器进入
while(m.find())
时,它不会出现在外部。 最佳答案
你有一个灾难性的回溯案例,当没有找到匹配项时发生,但是必须在每个可能的长度组合中检查两个可变长度的不匹配替代项,以证明不存在匹配项。从数学上讲,组合的数量随着输入的长度呈指数增长。
这是正则表达式的问题部分:
(([A-Za-z0-9])+([ ]| , )?([A-Za-z0-9]))+
它是一个或多个字母/数字、可选空格和一个或多个字母/数字。当输入长度较大时,可以看到每个“一个或多个”的数量组合很大。