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)

解决方案 »

  1.   

    jsoup 或者 htmlparse 提去网页标签内容
      

  2.   

    解析html标签不用这么麻烦,这个方法不行,那就再换一种了,这种方法看起来效率不是很高!
      

  3.   

    Pattern.compile(begin+"((?:.|\n|\r)*?)"+end);不要想当然地用 \n|\r!改成:Pattern.compile(begin+"((?s:.)*?)"+end);另外,你能保证你的 begin 和 end 中没有正则表达式的特殊字符?
      

  4.   

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

  5.   

    这个你不用担心
    我提取2M大的网页文件 内容都没事 你加好过滤条件就行了
    htmlparse 确实性能有些~~ 内存溢出到源代码了~~
      

  6.   

    853个字符就报内存溢出是什么情况啊?还有你确定你那个<tr>里不嵌套<tr>,比如<tr class=\"GridItem\" nowrap=\"nowrap\"><table><tr></tr></table></tr>,你那个正则就不对了
      

  7.   

    的确没有任何压力,性能很好。 就是有个地方比较困扰。
    提取<tr class=“xxx”>后,标签里有一个input标签,然后jsoup就自动帮我加了对<form></form>将其包起来不知道谁能解释下原因