【问题标题】:stackoverflow exception while using String match in java在java中使用字符串匹配时出现stackoverflow异常
【发布时间】:2011-04-01 20:03:36
【问题描述】:

对于我正在做的一个小型大学项目,我需要从作为字符串给出的 html 中提取代码示例。 更准确地说,我需要从那个 html 字符串中获取 <code></code> 之间的所有内容。

我正在用 Java 编写,并使用 String.match 来做到这一点。

我的代码:

public static ArrayList<String> extractByHTMLtagDelimiters(String source, String startDelimiter, String endDelimiter){
ArrayList<String> results = new ArrayList<String>();
if (source.matches("([\t\n\r]|.)*" + startDelimiter + "([\t\n\r]|.)*" + endDelimiter)){
    //source has some code samples in it
    //get array entries of the form: {Some code}</startDelimiter>{something else}
    String[] splittedSource = source.split(startDelimiter);
        for (String sourceMatch : splittedSource){
        if (sourceMatch.matches("([\t\n\r]|.)*" + endDelimiter + "([\t\n\r]|.)*")){
            //current string has code sample in it (with some body leftovers)
            //the code sample located before the endDelimiter - extract it
            String codeSample = (sourceMatch.split(endDelimiter))[0];
            //add the code samples to results
            results.add(codeSample);
        }
        }
}
return results;

iv'e 试图从大约 1300 个字符的一些 html 中提取样本并得到相当大的异常:(它持续了几十行)

Exception in thread "main" java.lang.StackOverflowError
at java.util.regex.Pattern$Branch.match(Unknown Source)
at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$Loop.match(Unknown Source)
at java.util.regex.Pattern$GroupTail.match(Unknown Source)
at java.util.regex.Pattern$BranchConn.match(Unknown Source)
at java.util.regex.Pattern$CharProperty.match(Unknown Source)
at java.util.regex.Pattern$Branch.match(Unknown Source)
at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$Loop.match(Unknown Source)
at java.util.regex.Pattern$GroupTail.match(Unknown Source)
at java.util.regex.Pattern$BranchConn.match(Unknown Source)
at java.util.regex.Pattern$CharProperty.match(Unknown Source)
at java.util.regex.Pattern$Branch.match(Unknown Source)
at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$Loop.match(Unknown Source)
at java.util.regex.Pattern$GroupTail.match(Unknown Source)
at java.util.regex.Pattern$BranchConn.match(Unknown Source)
at java.util.regex.Pattern$CharProperty.match(Unknown Source)
at java.util.regex.Pattern$Branch.match(Unknown Source)
at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$Loop.match(Unknown Source)

我发现了以下错误报告: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5050507

我可以做些什么来继续使用 string.match 吗?如果没有,请您推荐一些其他方法来做到这一点而不自己实现html解析?

非常感谢, 配音。

【问题讨论】:

  • @khachik,如果您费心查看该错误,您会意识到它已被关闭为“不会修复”,因为它对于 regex 库的编写方式非常基础。所以升级不会有任何区别。
  • @Matthew:你是对的。
  • 我正在使用最新的Java(我想,我几个月前更新了),我刚刚提到我在网络上遇到了这个问题,看起来在我的Java版本中它仍然存在。
  • 不要使用正则表达式解析html :)

标签: java string exception stack-overflow match


【解决方案1】:

您可以使用 String 的 indexOf() 方法手动遍历输入字符串以查找开始和结束分隔符并提取自己之间的位。

public static void main(String[] args) {
    String source = "<html>blah<code>this is awesome</code>more junk</html>";

    String startDelim = "<code>";
    String endDelim = "</code>";
    int start = source.indexOf(startDelim);
    int end = source.indexOf(endDelim);

    String code = source.substring(start + startDelim.length(), end);
    System.out.println(code);
}

如果您需要找到多个,那么只需从您完成的那一点开始再次使用indexOf

int nextStart = source.indexOf(startDelim, end + endDelim.length())

【讨论】:

  • 谢谢,它成功了!不知何故,我总是忘记最简单的解决方案可能是最好的。
【解决方案2】:

只需将您的正则表达式模式替换为 "(?s).*"

这匹配任何内容,包括您想要的新行。

【讨论】:

  • 就个人而言,我更喜欢 wolfcastle 的非正则表达式解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 2015-08-02
  • 2013-08-11
  • 1970-01-01
  • 2022-07-22
  • 2010-10-01
  • 2020-10-25
相关资源
最近更新 更多