Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么下面的程序有PatternSyntax例外?_Java_Regex_Exception - Fatal编程技术网

Java 为什么下面的程序有PatternSyntax例外?

Java 为什么下面的程序有PatternSyntax例外?,java,regex,exception,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(Stri

我得到以下程序的模式语法异常。我使用
“\\\”
避开了反斜杠,但仍然有一个例外,即:

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\\("};
但是,您的
包含(…)
调用将不再有效

或者更好/更安全,让
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
的锚定,所以即使这不会引发异常,您也不会得到想要的结果

相反,请使用
replace
(不带
All
后缀)方法,该方法将自动转义所有正则表达式元字符,因此可以避免未转义
)等问题

所以试试看

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

尝试转义
paren
的值中的
String#replaceAll
方法通过正则表达式模式编译器传递其第一个参数,
对分组有特殊的正则表达式含义,但也要求结束
您的
参数
值没有。@ajp15243,谢谢!您的解决方案有效:)