给定一个包含一对括号的字符串,计算 递归地由一个由括号和它们组成的新字符串 内容,所以" xyz(abc)123"收益率"(abc)"。 parenBit(" xyz(abc)123")→ "(ABC)"
parenBit(" x(你好)")→"(你好)"
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 "";
}
为什么这会返回" String索引超出范围:0"错误?
答案 0 :(得分:0)
每次递归都会缩短您检查的字符串的长度。在最后一次递归中,您将有一个空字符串并尝试访问索引0.如果字符串为空,则在函数顶部添加一个检查,如果是,则为break。
在调用str.substring(1, str.length() - 1)
之前,您还应检查长度为2,否则可能会出现另一个索引错误。
答案 1 :(得分: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;
}