簡體   English   中英

Java 正則表達式轉義字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM