java - 正则表达式中的无限循环

标签 java regex

我的程序在某个点上挂起字符串可能是因为正则表达式中的无限循环。
我的字符串值是

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]))+

它是一个或多个字母/数字、可选空格和一个或多个字母/数字。当输入长度较大时,可以看到每个“一个或多个”的数量组合很大。

关于java - 正则表达式中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20948986/

相关文章:

java - 正则表达式替换字符串中的字符

java - Java 中的类别名结构

regex - 替换\into//在R中使用gsub

正则表达式:计算单词列表中的匹配项

java - 与 Java 的 SSH 连接

java - Spring - JPA - 插入 - 不传递具有默认值的字段的值会引发错误

java - 从 OS X 上的 Java 应用程序中的自定义 URI 方案访问参数

javascript - 子字符串的正则表达式

javascript - javascript中的正则表达式问题

html - 需要帮助创建正则表达式或脚本以在 html 文件上运行