我正在搜索正则表达式 - “。(冲突副本。”。我为此编写了以下代码
String str = "12B - (conflicted copy 2013-11-16-11-07-12)";
boolean matches = str.matches(".*(conflicted.*");
System.out.println(matches);
但我得到了例外
线程“main”中的异常java.util.regex.PatternSyntaxException:索引15附近的未闭合组 (冲突。
我理解编译器认为(
是模式组的开头。我试图通过添加(
来逃避\(
,但这不起作用。
有人可以告诉我如何逃离(
吗?
答案 0 :(得分:7)
转义由\
完成。在Java中,\
被写为\\
1 ,因此您应该转义(
为\\(
。
旁注:最好看一下Pattern#quote
返回文字模式字符串。在你的情况下,它没有那么有用,因为你不想逃避所有special-characters。
答案 1 :(得分:2)
(
是元字符,表示“组的开始”,需要用)
关闭。如果你想让refex引擎以简单的文字形式进行操作,你就需要逃避它。您可以通过在它之前添加\
来实现,但由于\
也是字符串中的元字符(例如用于创建"\n"
,"\t"
之类的字符),您需要转义它也看起来像"\\"
。所以试试
str.matches(".*\\(conflicted.*");
其他选项是使用字符类来转义(
,如
str.matches(".*[(]conflicted.*");
您还可以在需要转发的部分使用Pattern.quote()
,例如
str.matches(".*"+Pattern.quote("(")+"conflicted.*");
或者只是将所有字符应该作为文字标注的部分包含"\\Q"
和"\\E"
,代表报价的开头和结尾。
str.matches(".*\\Q(\\Econflicted.*");
答案 2 :(得分:1)
在正则表达式中,可以通过在前面添加反斜杠来安全地转义所有字符。
请记住,在大多数语言中,包括C#,PHP和Java,反斜杠本身也是本机转义,因此需要在非文字字符串中进行转义,因此要求您输入"myText \\("
在正则表达式中使用反斜杠可能需要您在语言级别和正则表达式级别("\\\\"
)上对其进行转义:这会将"\\"
传递给正则表达式引擎,该引擎会将其解析为{ {1}}本身。