线程“main”中的异常java.util.regex.PatternSyntaxException:无法匹配的结束

时间:2015-01-26 07:44:09

标签: java regex exception string-split

我试图翻译句子" b((aa)a)b $"使用代码注释中显示的语法。当我尝试运行它时,它会出现以下错误。字符串拆分方法似乎是一个错误,但我不知道如何解决它。 有什么建议? 感谢。

  

运行:

     

B((a)中A)B $

     

线程中的异常" main" java.util.regex.PatternSyntaxException:无与伦比的结束')'在指数3附近

     

A)

     

^       在java.util.regex.Pattern.error(Pattern.java:1955)       在java.util.regex.Pattern.compile(Pattern.java:1700)       在java.util.regex.Pattern。(Pattern.java:1351)       在java.util.regex.Pattern.compile(Pattern.java:1028)       在java.lang.String.split(String.java:2367)       at exercise3.GrammarTest.parser(GrammarTest.java:28)       at exercise3.GrammarTest.parser(GrammarTest.java:48)       在exercise3.GrammarTest.main(GrammarTest.java:62)

     

Java结果:1

     

建立成功(总时间:1秒)

//grammar
//<P> → <S>$ (P is the start symbol)
//<S> → b<M>b
//<M> → (<L>
//<M> → a
//<L> → <M> a)


public static String parser(String original, String sym, String rep){
    if( !(original.contains(sym))){
        return original;
    }

    String str = "";
    String [] parts = original.split(sym, 2);

    str = parts[0] + rep + parts[1];

    System.out.println(str);
    return str;
}           

public static String parser(String str){
    String [] sym = new String[5];
    //recursive                //b((aa)a)b$
    str = parser(str, "a", "<M>"); //b((<M>a)a)b$
    str = parser(str, "<M>a)", "<L>"); //b((<L>a)b$
    str = parser(str, "(<L>", "<M>"); //b(<M>a)b$
    str = parser(str, "<M>a)", "<L>"); //b(<L>b$
    str = parser(str, "(<L>", "<M>"); //b<M>b$
    str = parser(str, "b<M>b", "<S>"); //<S>$
    str = parser(str, "<S>$", "<P>"); //<P>

    System.out.println(str);

    return str;
}

public static void main(String[] args) {
    String str = " b((aa)a)b$ ";
    str = parser(str);       

}

3 个答案:

答案 0 :(得分:4)

如果要匹配(,则必须将其作为\\(转义,因为(是正则表达式组的开头。对于懒惰的人来说,Java包含了一个外观:Pattern.quote("(a"); /* gives you \\(a * /

答案 1 :(得分:1)

String .split方法接受正则表达式,而不是普通字符串。您的输入中有括号,因此它会查找匹配的括号以指示捕获的组。

不幸的是,.contains没有使用正则表达式,因此对这两种方法使用相同的字符串将非常困难。简单地拆分正则表达式可能会更好,并检查是否只有一个结果。如果是这样,就没有匹配。

答案 2 :(得分:1)

您需要转义模式中的括号

str = parser(str, "<M>a\\)", "<L>"); //b((<L>a)b$
str = parser(str, "\\(<L>", "<M>"); //b(<M>a)b$
str = parser(str, "<M>a\\)", "<L>"); //b(<L>b$
str = parser(str, "\\(<L>", "<M>"); //b<M>b$