[英]Escape ( in regular expression
我正在搜索正則表達式 - “。 (沖突副本。 ”。我為此編寫了以下代碼
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附近的未閉合組。 (沖突。
我理解編譯器認為(
是模式組的開頭。我試圖逃避(
通過添加\\(
但這不起作用。
誰能告訴我如何逃避(
這里?
轉義是由\\
完成的。 在Java中, \\
寫為\\\\
1 ,所以你應該轉義(
將是\\\\(
。
旁注:最好看一下Pattern#quote
,它返回一個文字模式String 。 在你的情況下,它沒有那么有用,因為你不想逃避所有特殊字符 。
(
正則表達式是元字符,意思是“組的開始”,需要關閉)
。 如果你想讓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 \\\\("
。
在正則表達式中使用反斜杠可能需要您在語言級別和正則表達式級別( "\\\\\\\\"
)上對其進行轉義:這會將"\\\\"
傳遞給正則表達式引擎,該引擎將其解析為"\\"
本身。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.