编辑:找到解决方案 -
/**
* Returns the arguments of the method. Ensures inner methods are intact.
*
* @param fullMethod full method string
* @return arguments of the method
*/
public static String[] getArguments(String fullMethod) {
String innerFirstBrackets = fullMethod.substring(fullMethod.indexOf("(") + 1, fullMethod.lastIndexOf(")"));
if (innerFirstBrackets.contains("(") && innerFirstBrackets.contains(")")) {
List list = new List();
int count = 0;
int lastComma = 0;
for (int x = 0; x < innerFirstBrackets.length(); x++) {
if (innerFirstBrackets.charAt(x) == '(') {
count ++;
} else if (innerFirstBrackets.charAt(x) == ')') {
count --;
}
if (innerFirstBrackets.charAt(x) == ',' || x == innerFirstBrackets.length() - 1) {
if (count == 0) {
list.add(innerFirstBrackets.substring((lastComma == 0 ? -1 : lastComma) + 1,
(x == innerFirstBrackets.length() - 1 ? x + 1 : x)).trim());
lastComma = x;
}
}
}
return list.getItems();
} else {
// No inner methods
return innerFirstBrackets.split(",");
}
}
我试图在方法的String
表示内部获取参数。到目前为止,我已经成功地在大多数情况下这样做,但它对某些情况不起作用。
以下是我目前的代码:
/**
* Returns the arguments of the method. Ensures inner methods are intact.
*
* @param fullMethod full method string
* @return arguments of the method
*/
public static String[] getArguments(String fullMethod) {
String innerFirstBrackets = fullMethod.substring(fullMethod.indexOf("(") + 1, fullMethod.lastIndexOf(")"));
if (innerFirstBrackets.contains("(") && innerFirstBrackets.contains(")")) {
List list = new List();
boolean first = false, second = false;
int lastComma = 0;
for (int x = 0; x < innerFirstBrackets.length(); x++) {
if (innerFirstBrackets.charAt(x) == '(') {
first = !second;
} else if (innerFirstBrackets.charAt(x) == ')') {
second = true;
}
if (first && second) {
first = second = false;
}
if (innerFirstBrackets.charAt(x) == ',' || x == innerFirstBrackets.length() - 1) {
if (!first) {
list.add(innerFirstBrackets.substring((lastComma == 0 ? -1 : lastComma) + 1,
(x == innerFirstBrackets.length() - 1 ? x + 1 : x)).trim());
lastComma = x;
}
}
}
return list.getItems();
} else {
// No inner methods
return innerFirstBrackets.split(",");
}
}
当有一个方法作为参数时,这种方法有效,但当多个带有方法作为参数的参数存在时,它不起作用。这不常见,但我不喜欢在我的代码中出现漏洞。
有效的方法示例
get(get(1,2));
或
get(get(get(get(1,2))));
或
get(get(1),get(1));
但是当这样的事情发生时它就不起作用了
get(get(get(1)),get(1));
我不确定如何找到姐妹括号,而不只是找到下一个括号。 (如果您不知道姐妹括号的含义,请考虑在大多数IDE中,当您突出显示一个括号时,另一个会自动突出显示.EX。
答案 0 :(得分:3)
我不确定我理解为什么逗号是你的算法的问题。您可以做的是开始向右扫描字符(假设您从(
左括号开始),将计数器初始化为0,并且:
(
)
当计数器再次达到零时,您已找到匹配对。您唯一需要注意的是引用字符串,其中代码在单引号或双引号内有随机括号(您不希望将这些括号应用于您的计数器)。
答案 1 :(得分:1)
如果你关心的只是parens,你可以保持一个简单的计数器来找到匹配的paren。
伪代码:
int start=-1, end=-1;
int paren_depth = 0;
for(int i=0; i<length; i++) {
if(str[i] == '(') {
if(paren_depth == 0) start = i;
paren_depth++;
} else if(str[i] == ')') {
paren_depth--;
if(paren_depth == 0) {
end = i;
break;
}
}
}
// get substring from start to end
如果你也想处理其他标点符号,你应该使用堆栈来存储标点符号上下文,或者只使用递归(当你看到括号时递归,当你找到一个小括号时返回)。