java正则表达式 提取溢出

EvilCross 2011-03-03 10:32:57

public static String[] match(String original,int start, String begin, String end) {
Pattern pat = Pattern.compile(begin+"((?:.|\n|\r)*?)"+end); //? 跟在限定字符后,非贪婪模式
Matcher mat = pat.matcher(original);
mat.region(start, original.length());
if(mat.find()){
logger.info(mat.group(0) +" start:"+mat.start()+" end:"+mat.end()+" count:"+mat.groupCount());
return new String[]{mat.group(1),String.valueOf(mat.start()),String.valueOf(mat.end())};
}
return null;
}
public static void main(String[] args){
match(getTestStr(), 0, "<tr class=\"GridItem\" nowrap=\"nowrap\">", "</tr>");
}

其中getTestStr()方法读取一个html文件返回其字符;当begin + group(0) + end有853个字符时,就抛出内存溢出的异常
想问下这种情况怎么解决,或者什么开源项目能够解决
主要工作是从html解析提取指定标签 之间的内容,感觉如果使用indexof方式会比较繁琐

Exception in thread "main" java.lang.StackOverflowError
at java.lang.Character.codePointAt(Character.java:2335)
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3344)
at java.util.regex.Pattern$Branch.match(Pattern.java:4114)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$LazyLoop.match(Pattern.java:4357)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078)
...全文
564 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
a404125339 2011-03-03
  • 打赏
  • 举报
回复
5楼的是高手啊
loveofmylife 2011-03-03
  • 打赏
  • 举报
回复
853个字符就报内存溢出是什么情况啊?

还有你确定你那个<tr>里不嵌套<tr>,比如<tr class=\"GridItem\" nowrap=\"nowrap\"><table><tr></tr></table></tr>,你那个正则就不对了
zn85600301 2011-03-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 evilcross 的回复:]

jsoup很强大,就是不知道取出返回的字符串过大时会不会有问题,吃完饭后试下
[/Quote]
这个你不用担心
我提取2M大的网页文件 内容都没事 你加好过滤条件就行了
htmlparse 确实性能有些~~ 内存溢出到源代码了~~
EvilCross 2011-03-03
  • 打赏
  • 举报
回复
jsoup很强大,就是不知道取出返回的字符串过大时会不会有问题,吃完饭后试下
  • 打赏
  • 举报
回复
Pattern.compile(begin+"((?:.|\n|\r)*?)"+end);

不要想当然地用 \n|\r!改成:

Pattern.compile(begin+"((?s:.)*?)"+end);

另外,你能保证你的 begin 和 end 中没有正则表达式的特殊字符?
0轰隆隆0 2011-03-03
  • 打赏
  • 举报
回复
解析html标签不用这么麻烦,这个方法不行,那就再换一种了,这种方法看起来效率不是很高!
zn85600301 2011-03-03
  • 打赏
  • 举报
回复
jsoup 或者 htmlparse 提去网页标签内容
EvilCross 2011-03-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zn85600301 的回复:]

引用 6 楼 evilcross 的回复:

jsoup很强大,就是不知道取出返回的字符串过大时会不会有问题,吃完饭后试下

这个你不用担心
我提取2M大的网页文件 内容都没事 你加好过滤条件就行了
htmlparse 确实性能有些~~ 内存溢出到源代码了~~
[/Quote]
的确没有任何压力,性能很好。 就是有个地方比较困扰。
提取<tr class=“xxx”>后,标签里有一个input标签,然后jsoup就自动帮我加了对<form></form>将其包起来

不知道谁能解释下原因

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧