java - 无限循环 matcher.find()

标签 java regex

我正在尝试从 html 页面获取地址。我有一个正则表达式,从中我可以找到州、城市和电话号码。

String linearray[] = newdoc.split("\n");
int count = 0;
System.out.println(linearray.length);
while(count<linearray.length)
{
    System.out.println(count);
    Pattern pattern = Pattern.compile("(.*?)(\\d{1,4}(\\s*\\w*)*)(\\s*)(CA|AZ|NY)(\\s*)(\\(?[1-9]\\d{2}\\)?\\s*\\d{3}\\d{4})?(.*?)");
    Matcher matcher = pattern.matcher(linearray[count].trim());
    while (matcher.find()) {
        String state = matcher.group(5);
        String city = matcher.group(2);
        String phone = matcher.group(7);
        System.out.println("state "+state+" city "+city+" phone "+phone+" ");
    }
    count++;
}

当我尝试运行这段代码时,它进入了无限循环。 谁能帮我解决这个问题?

编辑:

linearray[count]==“Bombay Garden Newark SanMateo SantaClara © 2011 Bombay Garden All Rights Reserved” 时,我的代码卡在 while(matcher.find() )。知道为什么它会卡在那里吗?当我跳过该行(通过使用 continue)时,代码终止得很好!

最佳答案

您的正则表达式导致“catastrophic backtracking”,使其过于复杂而无法完成。

考虑将正则表达式重写为更多 possessive .

关于java - 无限循环 matcher.find(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20448125/

相关文章:

regex - MAC 地址的正则表达式是什么?

python - 在 python 中从 URL 中删除 GET 变量

Javascript 替换为 RegExp 重复本身?

java - Mybatis-错误: Could not set parameters for mapping

java - 代码覆盖率插件在 NetBeans 7.0 中是否仍然可用?我该如何使用它?

regex - 正则表达式如何设置任意数量的字符,但需要 '|'?

regex - 不确定我是否理解正则表达式 : (\b\w+)\1\b?

java - 图形/网络数据结构的 Java API 列表

java - 新对象似乎改变了先前对象的字段

java - 了解 Java GUI 开发、管理和设置 JComponents