线程 "main" java.util.regex.PatternSyntaxException 中的异常:不匹配的关闭
Exception in thread "main" java.util.regex.PatternSyntaxException: Unmatched closing
我正在尝试使用代码注释中显示的语法将句子 "b((aa)a)b$" 翻译回来。当我尝试 运行 它时,它会出现以下错误。似乎是字符串拆分方法的错误,但我不知道如何修复它。
有什么建议么?
谢谢
run:
b((a)a)b$
Exception in thread "main" java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 3
a)
^
at java.util.regex.Pattern.error(Pattern.java:1955)
at java.util.regex.Pattern.compile(Pattern.java:1700)
at java.util.regex.Pattern.(Pattern.java:1351)
at java.util.regex.Pattern.compile(Pattern.java:1028)
at java.lang.String.split(String.java:2367)
at exercise3.GrammarTest.parser(GrammarTest.java:28)
at exercise3.GrammarTest.parser(GrammarTest.java:48)
at exercise3.GrammarTest.main(GrammarTest.java:62)
Java Result: 1
BUILD SUCCESSFUL (total time: 1 second)
//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);
}
当你想匹配 (
时,你必须将其转义为 \(
,因为 (
是一组正则表达式的开始。对于懒惰的人,Java 包含一个外观:Pattern.quote("(a"); /* gives you \(a
*/
String .split
方法采用正则表达式,而不是纯字符串。您的输入中有括号,因此它会查找匹配的括号以指示捕获的组。
不幸的是,.contains
不采用正则表达式,因此对这两种方法使用相同的字符串将非常困难。简单地拆分正则表达式并检查是否只有一个结果可能会更好。如果是,则没有匹配项。
您需要对模式中的括号进行转义
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$
我正在尝试使用代码注释中显示的语法将句子 "b((aa)a)b$" 翻译回来。当我尝试 运行 它时,它会出现以下错误。似乎是字符串拆分方法的错误,但我不知道如何修复它。 有什么建议么? 谢谢
run:
b((a)a)b$
Exception in thread "main" java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 3
a)
^ at java.util.regex.Pattern.error(Pattern.java:1955) at java.util.regex.Pattern.compile(Pattern.java:1700) at java.util.regex.Pattern.(Pattern.java:1351) at java.util.regex.Pattern.compile(Pattern.java:1028) at java.lang.String.split(String.java:2367) at exercise3.GrammarTest.parser(GrammarTest.java:28) at exercise3.GrammarTest.parser(GrammarTest.java:48) at exercise3.GrammarTest.main(GrammarTest.java:62)
Java Result: 1
BUILD SUCCESSFUL (total time: 1 second)
//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);
}
当你想匹配 (
时,你必须将其转义为 \(
,因为 (
是一组正则表达式的开始。对于懒惰的人,Java 包含一个外观:Pattern.quote("(a"); /* gives you \(a
*/
String .split
方法采用正则表达式,而不是纯字符串。您的输入中有括号,因此它会查找匹配的括号以指示捕获的组。
不幸的是,.contains
不采用正则表达式,因此对这两种方法使用相同的字符串将非常困难。简单地拆分正则表达式并检查是否只有一个结果可能会更好。如果是,则没有匹配项。
您需要对模式中的括号进行转义
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$