为什么跟踪括号的解析器不起作用?

时间:2014-03-05 00:28:09

标签: java regex parsing

我想知道为什么解析器部分(分离出来)不起作用。它正在打印所有内容,就好像我没有添加解析器一样。在我的原始代码(不是解析器指示)中,它将(a) n或(a) {n}转换为\ pochhammer {a} {n},但它不会对具有嵌套括号的模式执行此操作里面的a。解析器应该忽略嵌套括号中的“(a(b)) n或(a(b)) {n}并打印出\ pochhammer {a(b)} {n谢谢。

while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        Pattern cpochhammer = Pattern.compile("\\(([^)]+)\\)_\\{([^}]+)\\}");
        Matcher pochhammer = cpochhammer.matcher(line);
        StringBuffer rplcmntBfr = new StringBuffer();

解析器:

        char toCheck = '(';
        char toChecko = ')';
        int count = 0;
        for (int i = 0; i < line.length(); i++) {
            if (line.charAt(i) == toCheck) {
                count++;
            }
            if (line.charAt(i) == toChecko) {
                count--;
            }
            if (count == 0 && line.indexOf(")_") == i) {
                Pattern dnestedParen = Pattern.compile("\\((.+)\\)_\\{([^}]+)\\}");
                Matcher dmnestedParen = dnestedParen.matcher(rplcmntBfr.toString());
                if (dmnestedParen.find())
                    dmnestedParen.appendReplacement(rplcmntBfr,
                            "\\\\pochhammer{$1}{$2}");
            }
        }

结束解析器

while (pochhammer.find()) {
            pochhammer.appendReplacement(rplcmntBfr,
                    "\\\\pochhammer{$1}{$2}");
        }
        pochhammer.appendTail(rplcmntBfr);
        Pattern npochhammer = Pattern.compile("\\(([^)]+)\\)_(.)");
        Matcher ppochhammer = npochhammer.matcher(rplcmntBfr.toString());
        rplcmntBfr.setLength(0);

解析器:

        count = 0;
        for (int i = 0; i < line.length(); i++) {
            if (line.charAt(i) == toCheck) {
                count++;
            }
            if (line.charAt(i) == toChecko) {
                count--;
            }
            if (count == 0 && line.indexOf(")_") == i) {
                Pattern nestedParen = Pattern.compile("\\((.+)\\)_(.)");
                Matcher mnestedParen = nestedParen.matcher(rplcmntBfr.toString());
                if(mnestedParen.find())
                    mnestedParen.appendReplacement(rplcmntBfr,
                        "\\\\pochhammer{$1}{$2}");
            }
        }

结束解析器

        while (ppochhammer.find()) {
            ppochhammer.appendReplacement(rplcmntBfr,
                    "\\\\pochhammer{$1}{$2}");
        }
        ppochhammer.appendTail(rplcmntBfr);
        writer.println(rplcmntBfr);
    }

1 个答案:

答案 0 :(得分:3)

因为它不是解析器。它是一个扫描仪,使用正则表达式,正则表达式不能算什么,更不用说括号了。要解析任何类型的嵌套语法,您需要显式或隐式堆栈,这将使您完全脱离正则表达式的范围进入解析器世界。看看Dijkstra Shunting-yard算法,或递归下降表达式解析。