日期:2014-05-20  浏览次数:20707 次

通过正则表达式替换字符串报 java.lang.StackOverflowError
大家可以运行下面这段测试代码看看,是不是会抛出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   =   "[quote=username]\r\n测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试n[/quote]bbbbbbbb ";
String   re   =   "\\[quote=(.[^\\[]*)\\]((.|\\s)*)\\[\\/quote\\] ";
Pattern   pattern   =   Pattern.compile(re);
Matcher   matcher   =   pattern.matcher(str);

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


------解决方案--------------------
一样的,string太长了。
------解决方案--------------------
str.indexOf( "quote ")
substring

细节可以自己考虑~~
------解决方案--------------------
既然有长度限制,就饶开嘛:

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 = "[quote=username]\r\nn[/quote]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( " "));
}
}
}
------解决方案--------------------
public static void main(String[] args) {
  String str = "[quote=username]a\r\n....n[/quote] bbbbbbbb ";    
  int start = -1;
  int end = -1;
  Pattern pattern = Pattern.compile( "\\[quote=(.[^\\[]*)\\] ");
  Matcher matcher = pattern.matcher(str);
  if(matcher.find()) {
    start = matcher.end();
  }
  end = str.lastIndexOf( "[/quote] ");
  if(start > -1 && end > -1) {
    str = str.replace(str.substring(start, end), " ");
  }
  System.out.println(str);
}
------解决方案--------------------
如果标记也不需要的话稍微改成:

if(matcher.find()) {
  start = matcher.start();
}
end = str.lastIndexOf( "[/quote] ") + "/[quote] ".length();