2016-11-14 52 views
-4

鉴于包含一对括号的字符串的字符串索引,计算 递归制成仅括号及其 内容的一个新的字符串,所以“XYZ(ABC)123”产率“( ABC)”。 parenBit( “XYZ(ABC)123”)→ “(ABC)”获取绑定错误

parenBit( “×(你好)”)→ “(你好)”

parenBit( “(XY)1”)→ “(XY)”

boolean foundc = false; 
    boolean foundd = false; 

    public String parenBit(String str) { 
     char c = str.charAt(0); 
     char d = str.charAt(str.length() - 1); 


     if(c == '('){ 
      foundc = true; 
      return parenBit(str.substring(0, str.length() - 1)); 

     } 

     if(foundc == false){ 
      return parenBit(str.substring(1, str.length() - 1)); 

     } 

     if(d == ')'){ 
      foundd = true; 
      str.substring(0, str.length() - 1); 

     } 

     if(foundd == false){ 
      return str.substring(0, str.length() - 2); 

     } 


     return ""; 
    } 

为什么这个返回 “字符串索引超出范围:0” 的错误?

+1

哪条线给你错误?你有没有通过调试器完成这一步? – bradimus

+0

可以请你发布完整的stacktrace吗? – XtremeBaumer

+0

为什么你不能获得'('char和'''char')的位置,然后返回它们之间的内容?看起来很奇怪,你是怎么做到的 –

回答

0

随着每次递归,您正在减少您检查的字符串的长度。在最后一个递归中,你将有一个空字符串,并尝试访问索引0.如果字符串为空,并且如果是,break时,在函数顶部添加一个检查。

在致电str.substring(1, str.length() - 1)之前,您还应该检查长度是2,否则您可能会收到另一个索引错误。

0

你可能更适合使用正则表达式。类似这样的:

var input = "xyz(abc)123(blah)"; 
var exp = @"\((?<content>[^)]*)\)"; 
var matches = System.Text.RegularExpressions.Regex.Matches(input, exp); 

foreach (var match in matches) { 
    // Gets called twice, once for "abc" and once for "blah" 
    var group = match.Groups["content"].Value; 
}