【发布时间】: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