1

编辑:找到解决方案 -

/**
 * 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。在此处输入图像描述

4

2 回答 2

3

我不确定我是否理解为什么逗号对您的算法来说是个问题。您可以做的是开始向右扫描字符(假设您(从左括号开始),将计数器初始化为 0,然后:

  • 每次遇到(
  • 每次遇到)

当计数器再次变为零时,您就找到了匹配的对。您唯一需要注意的是带引号的字符串,其中代码在单引号或双引号内有随机括号(您不想将它们应用于您的计数器)。

于 2012-10-19T04:14:53.873 回答
1

如果您只关心括号,您可以维护一个简单的计数器来查找匹配的括号。

伪代码:

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

如果你也想处理其他标点符号,你应该使用堆栈来存储标点符号上下文,或者只使用递归(当你看到括号时递归,当你找到右括号时返回)。

于 2012-10-19T04:15:49.063 回答