逃脱(正则表达式

我正在搜索正则表达式 – “。 (冲突副本。 ”。我为此编写了以下代码

String str = "12B - (conflicted copy 2013-11-16-11-07-12)"; boolean matches = str.matches(".*(conflicted.*"); System.out.println(matches); 

但我得到了例外

线程“main”中的exceptionjava.util.regex.PatternSyntaxException:索引15附近的未闭合组。 (冲突。

据我所知,编译器认为(是模式组的开头。我试图逃避(通过添加\(但这不起作用)。

谁能告诉我如何逃避(这里?

转义是由\完成的。 在Java中, \写为\\ 1 ,所以你应该转义(将是\\(

旁注:最好看一下Pattern#quote ,它返回一个文字模式String 。 在你的情况下,它没有那么有用,因为你不想逃避所有特殊字符 。


1因为前面带有反斜杠( \ )的字符是转义序列,对编译器具有特殊含义 。

(正则表达式是元字符,意思是“组的开始”,需要关闭) 。 如果你想让refex引擎把它作为简单的文字,你需要逃避它。 您可以通过在它之前添加\来实现,但由于\也是字符串中的元字符(例如用于创建"\n""\t"类的字符),您还需要将其转义为"\\" 。 所以试试吧

 str.matches(".*\\(conflicted.*"); 

其他选项是使用字符类来逃避(比如

 str.matches(".*[(]conflicted.*"); 

您还可以在需要转义的部分使用Pattern.quote()

 str.matches(".*"+Pattern.quote("(")+"conflicted.*"); 

或者简单地将所有字符应该作为文字的部分包围,其中"\\Q""\\E"表示引用的开始和结束。

 str.matches(".*\\Q(\\Econflicted.*"); 

在正则表达式中,可以通过在前面添加反斜杠来安全地转义所有字符。

请记住,在大多数语言中,包括C#,PHP和Java,反斜杠本身也是本机转义,因此需要在非文字字符串中进行转义,因此要求您输入"myText \\("

在正则表达式中使用反斜杠可能需要您在语言级别和正则表达式级别( "\\\\" )上对其进行转义:这会将"\\"传递给正则表达式引擎,该引擎将其解析为"\"本身。