繁体   English   中英

为什么下面的程序有一个PatternSyntax Excpetion?

[英]Why is there a PatternSyntax Excpetion for the following program?

我正在为以下程序获取模式语法异常。 我已经使用"\\\\"来转义了反斜杠,但是仍然有一个例外:

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
}

谢谢。

\\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), "(");
    }
}

如果您的目标是替换每个文字"\\\\big(""\\\\Big(""\\\\bigg(""\\\\Bigg(""\\\\left("则避免使用replaceAll因为它使用regex作为表示要替换的值的第一个参数。在您的情况下,要替换的字符串包含regex元字符,例如(\\\\b \\\\B这样的锚,因此即使这不会引发Exception,也不会获得所需的结果。

而是使用replace (不带All后缀)方法,该方法将自动转义所有正则表达式元字符,因此您将避免未转义(

所以尝试

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM