[英]Java Regex Escape Characters
我正在學習正則表達式,並在實施中遇到了麻煩。
我在 Java 教程中找到了RegexTestHarness
並運行它,以下字符串正確標識了我的模式:
[\d|\s][\d]\.
(我的模式是任何兩位數,或任何前面有空格,后跟句點的單個數字。)
該字符串是通過代碼中的這一行獲得的:
Pattern pattern =
Pattern.compile(console.readLine("%nEnter your regex: "));
當我嘗試在 Eclipse 中編寫一個簡單的類時,它告訴我轉義序列無效,除非我將字符串更改為:
[\\d|\\s][\\d]\\.
在我的課堂上,我使用`Pattern pattern = Pattern.compile();
當我將此字符串放回TestHarness
它找不到正確的匹配項。
有人能告訴我哪個是正確的嗎? 與console.readLine()
某些格式有區別嗎?
\\
是字符串文字"..."
特殊字符。 它用於轉義其他特殊字符,或創建像\\n
\\r
\\t
這樣的字符。
要在可以在正則表達式引擎中使用的字符串文字中創建\\
字符,您需要通過在它之前添加另一個\\
來對其進行轉義(就像您在正則表達式中需要轉義其元字符(如點\\.
)時所做的那樣)。 所以代表\\
字符串看起來像"\\\\"
。
當您從用戶讀取數據時不存在此問題,因為您已經在讀取文字,因此即使用戶將在控制台中寫入\\n
它也會被解釋為兩個字符\\
和n
。
也沒有必要添加|
內部類字符[...]
除非您的目的是使該類也匹配|
字符,請記住[abc]
與(a|b|c)
相同,因此不需要|
在"[\\\\d|\\\\s]"
。
我的模式是任何兩位數或一位數,前面是一個空格,后面是一個句點。)
正確的正則表達式將是:
Pattern pattern = Pattern.compile("(\\s\\d|\\d{2})\\.");
此外,如果您從用戶輸入中獲取正則表達式字符串,那么您應該調用:
Pattern.quote(useInputRegex);
轉義所有正則表達式特殊字符。
你也雙重轉義,因為第一個轉義由 String 類處理,第二個轉義傳遞給正則表達式引擎。
如果要在 Java 字符串文字中表示反斜杠,則需要使用另一個反斜杠對其進行轉義,因此字符串文字"\\\\s"
是兩個字符, \\
和s
。 這意味着要表示正則表達式[\\d\\s][\\d]\\.
在 Java 字符串文字中,您將使用"[\\\\d\\\\s][\\\\d]\\\\."
.
請注意,我還對您的正則表達式稍作修改, [\\d|\\s]
將匹配數字、空格或文字|
特點。 你只想要[\\d\\s]
。 字符類已經意味着“匹配其中之一”,因為您不需要|
對於字符類中的交替,它失去了它的特殊意義。
發生的事情是轉義序列被評估了兩次。 一次用於 Java,然后一次用於您的正則表達式。
結果是,當您使用正則表達式轉義序列時,您需要對轉義字符進行轉義。
例如,如果你需要一個數字,你會使用
"\\d"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.