为什么以下程序存在模式语法异常?

时间:2014-04-23 20:11:02

标签: java regex exception

我收到以下程序的模式语法异常。我使用"\\"转义了反斜杠,但还有一个例外:

Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 1
\left(

^

以下是代码:

String[] paren = {"\\big(","\\Big(","\\bigg(","\\Bigg(","\\left("};
for(String x : paren){
    if(line.contains(x))
        line=line.replaceAll(x, "("); //error on this line
}

感谢。

2 个答案:

答案 0 :(得分:2)

\l是一个无效的转义序列,您没有转义(

请注意,如果要匹配文字反斜杠,则需要对其进行双重转义,然后再将其转义,因为它们都位于字符串文字内。这就是为什么"\\l"被解析为正则表达式模式\l(这是一个无效的转义序列)的原因。 "\\b""\\B"被解析为转义序列\b\B,它们是单词和非单词边界。

假设您想匹配文字反斜杠,请尝试以下方法:

{"\\\\big\\(","\\\\Big\\(","\\\\bigg\\(","\\\\Bigg\\(","\\\\left\\("};

然后,您的contains(...)电话再也无法使用了!

或者更好/更安全,让Pattern正确引用/转义您的输入:

String[] paren = {"\\big(","\\Big(","\\bigg(","\\Bigg(","\\left("};

for(String x : paren){

    if(line.contains(x)) {

        line = line.replaceAll(Pattern.quote(x), "(");
    }
}

答案 1 :(得分:0)

如果您的目标是替换每个文字"\\big(""\\Big(""\\bigg(""\\Bigg(""\\left(",请避免使用replaceAll,因为它使用正则表达式作为表示应该替换的值的第一个参数。在您的情况下,您要替换的字符串包含(等正则表达式字符或\\b \\B之类的锚点,因此即使这不会抛出异常,也不会得到您想要的结果。

而是使用replace(没有All后缀)方法,它会自动转义所有正则表达式元字符,因此您可以避免像未转义(这样的问题。

请尝试使用

String[] paren = {"\\big(","\\Big(","\\bigg(","\\Bigg(","\\left("};
for(String x : paren){
    if(line.contains(x))
        line=line.replace(x, "("); 
}