关于java:Escape(以正则表达式表示

Escape ( in regular expression

我正在搜索正则表达式-"。(conflicted copy。"。)为此我编写了以下代码

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

但我得到了例外

Exception in thread"main" java.util.regex.PatternSyntaxException: Unclosed group near index 15
.(conflicted.

我了解编译器认为(是模式组的开始。 我试图通过添加\\(来转义(,但这不起作用。

有人可以告诉我如何在这里逃脱(吗?


转义由\\完成。在Java中,\\被写为\\\\ 1,因此您应转义(\\\\(

旁注:最好查看返回文字模式字符串String的Pattern#quote。对于您而言,这并不是很有用,因为您不想转义所有特殊字符。

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


正则表达式中的(是元字符,表示"组开始",需要用)关闭。如果希望refex引擎将其简化为简单文字,则需要对其进行转义。您可以通过在其前面添加\\来完成此操作,但是由于\\也是String中的元字符(例如,用于创建诸如"\
"
"\\t"之类的字符),因此您也需要对其进行转义,使其看起来像< x9>。所以尝试

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

另一种选择是使用字符类来像(那样转义

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

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

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

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

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

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

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

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