[英]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.