我收到以下程序的模式语法异常。我使用"\\"
转义了反斜杠,但还有一个例外:
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
}
感谢。
答案 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, "(");
}