大家可以运行下面这段测试代码看看,是不是会抛出java.lang.StackOverflowError异常,如果把str长度缩减一些倒是可以正常运行,如果在你的上没有抛出异常,请再增加str的长度试试测试代码:
====================================import java.util.regex.Matcher;
import java.util.regex.Pattern;public class ProgramTest {
public static void main(String[] args) throws Exception {
String str = "bbbbbbbb";
String re = "\\
Quote: (.[^\\[
*)\\]((.|\\s)*)\\[\\/quote\\]";
Pattern pattern = Pattern.compile(re);
Matcher matcher = pattern.matcher(str);

System.out.println(matcher.replaceAll( "" ));
}
}

解决方案 »

  1.   

    异常信息:
    =========================
    java.lang.StackOverflowError
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3313)
    at java.util.regex.Pattern$Branch.match(Pattern.java:3998)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4052)
    at java.util.regex.Pattern$Loop.match(Pattern.java:4179)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4111)
    at java.util.regex.Pattern$BranchConn.match(Pattern.java:3962)
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3335)
    at java.util.regex.Pattern$Branch.match(Pattern.java:3998)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4052)
    at java.util.regex.Pattern$Loop.match(Pattern.java:4179)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4111)
    at java.util.regex.Pattern$BranchConn.match(Pattern.java:3962)
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3335)
    at java.util.regex.Pattern$Branch.match(Pattern.java:3998)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4052)
    at java.util.regex.Pattern$Loop.match(Pattern.java:4179)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4111)
    at java.util.regex.Pattern$BranchConn.match(Pattern.java:3962)
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3335)
    at java.util.regex.Pattern$Branch.match(Pattern.java:3998)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4052)
    at java.util.regex.Pattern$Loop.match(Pattern.java:4179)
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4111)
    at java.util.regex.Pattern$BranchConn.match(Pattern.java:3962)
    at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3335)
    at java.util.regex.Pattern$Branch.match(Pattern.java:3998)
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4052)
    at java.util.regex.Pattern$Loop.match(Pattern.java:4179)
    .............
      

  2.   

    str.indexOf("quote")
    substring细节可以自己考虑~~
      

  3.   

    既然有长度限制,就饶开嘛:import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    public class Test {
    public static void main(String[] args) throws Exception {
    int maxLen = 820;
    String str = "bbbbbbbb";
    String re = "\\
    Quote: (.[^\\[
    *)\\]((.|\\s)*)\\[\\/quote\\]";
    Pattern pattern = Pattern.compile(re);
    int length = str.length() / maxLen;
    String subStr = "";
    for (int i = 0; i <= length; i++) {
    subStr = str.substring(i * maxLen, ((i+1)*maxLen > str.length())?str.length():(i+1)*maxLen);
    Matcher matcher = pattern.matcher(subStr);
    System.out.println(matcher.replaceAll(""));
    }
    }
    }
      

  4.   

    public static void main(String[] args) {
      String str = " bbbbbbbb";    
      int start = -1;
      int end = -1;
      Pattern pattern = Pattern.compile("\\");
      if(start > -1 && end > -1) {
        str = str.replace(str.substring(start, end), "");
      }
      System.out.println(str);
    }
      

  5.   

    TO zdjray(PubSoft) 
    不是没有去思考,而是这种方法对于圈套的quote处理起来比较麻烦TO sureyor()
    这样会把拆开了,我得再想想正则表达式该怎么写了,感觉变得复杂了很多
    其实我更想知道的是为什么会抛出这样的异常?本来以为用正则效率会更高才对,可就这么短的字符串就应付不了
      

  6.   

    如果标记也不需要的话稍微改成:if(matcher.find()) {
      start = matcher.start();
    }
    end = str.lastIndexOf("") + "/
    Quote:
    ".length();
      

  7.   

    这是JDK的Bug,呵呵,超过长度限制了的就会抛这种异常
      

  8.   

    不采用正则表达式(正则表达式的效率比较低),直接使用字符串进行处理。int start = -1;
    int end = -1;
    start = str.indexOf("[quote=");
    end = str.lastIndexOf("") + "/
    Quote:
    ".length();
    if(start > -1 && end > -1 && end > start) {
      str = str.substring(0, start) + str.substring(end);
    }
    System.out.println(str);这不是 JDK 的 Bug,正则表达式的实现是通过栈来进行了,也就是将字符一个一个地压入栈中,由于其中的字符太多,导致栈不够用了,所以就产生溢出了。
      

  9.   

    public static void ttt(){
    String str = " bbbbbbbb";
    String re = "\\ bbbbbbbb----------------------------------------------------------不是string太长了,是你的模式没写对~
    我写过的string要比这个长多了,
    用这个匹配都没问题的~
      

  10.   

    产生这个异常的主要原因是 Pattern 中的 matcher 采用了递归调用,字符较多产生了栈溢出。
      

  11.   

    bao110908(长牙了,好痛):哦?请问这个栈的长度是由什么来决定的?
      

  12.   

    String re = "\\
    Quote: .*?\\
    (.*?)\\[\\/quote\\]";
    Pattern pattern = Pattern.compile(re,Pattern.DOTALL + Pattern.MULTILINE);看看上面我的代码~
      

  13.   

    to: sureyorJava 中不是有栈空间和堆空间吗?具体的大小是由 Java 虚拟机来分配的,具体的大小我也不大清楚。