在字符串中找到姐妹支架

时间:2012-10-19 04:07:31

标签: java string parsing methods

编辑:找到解决方案 -

/**
 * 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。enter image description here

2 个答案:

答案 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

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