2013-12-18 176 views
0

我正在學習正則表達式,並在實現中遇到了麻煩。Java正則表達式轉義字符

我發現Java教程的RegexTestHarness,並運行它,下面的字符串正確識別我的模式:

[\d|\s][\d]\. 

(我的模式是任何兩位數,或者前面有一個空格任何一個數字,然後通過一段時間)

這串由該行代碼獲得:

Pattern pattern = 
     Pattern.compile(console.readLine("%nEnter your regex: ")); 

當我嘗試寫在Eclip一個簡單的類本質上,它告訴我的轉義序列是無效的,而且將無法編譯,除非我改變字符串:

[\\d|\\s][\\d]\\. 

在我的課堂我使用`Pattern pattern = Pattern.compile(); 當我把這個字符串回沒有關係的TestHarness找不到正確的匹配。

有人能告訴我哪一個是正確的嗎?是否與console.readLine()有些格式不同?

+2

您需要了解字符串文字和_Java_字符串轉義如何工作。 – SLaks

+0

此外,您的正則表達式不強制執行兩位數字之前的空格。使用anubhava的正則表達式。 – Gus

+0

我只在個位數字或雙位數字前面尋找空格(不關心前面的數字)。 –

回答

2

\是字符串文字"..."中的特殊字符。它用於轉義其他特殊字符,或者創建像\n\r\t這樣的字符。
要在字符串文字中創建\字符,您可以在正則表達式引擎中使用該字符,您需要在其之前添加另一個\(就像您在正則表達式中那樣需要轉義其元字符,如點號\.時)。所以代表\的字符串看起來像"\\"

當從用戶讀取數據這個問題不存在,因爲您已經閱讀文字,這樣即使用戶將在控制檯\n寫它會被解釋成兩個字符\n


也有正在增加|階級性[...]內沒有點,除非你的意圖是使類還匹配|字符,請記住,[abc]相同(a|b|c)所以沒有必要在"[\\d|\\s]"|

+0

謝謝。這就解釋了爲什麼通過示例程序/命令行輸入模式與編譯時輸入模式不同。 –

1

My pattern is any double digit or single digit preceded by a space, followed by a period.)

正確的正則表達式爲:

Pattern pattern = Pattern.compile("(\\s\\d|\\d{2})\\."); 

此外,如果你要根據用戶輸入的正則表達式的字符串,然後您應該撥打:

Pattern.quote(useInputRegex); 

爲了逃避所有正則表達式的特殊字符。

另外你還有兩次轉義,因爲1轉義是由String類處理的,第二個轉義是傳遞給正則表達式引擎的。

+0

對不起,我原來的帖子(引用)很差。我匹配以空格開頭的單個數字或兩位數字;在任何一種情況下,都會加一個'.'。 –

+0

哦,我明白了。根據您的意見更新答案。 – anubhava

0

發生了什麼是轉義序列正在評估兩次。一次爲java,然後一次爲你的正則表達式。

結果是,當您使用正則表達式轉義序列時,您需要轉義轉義字符。

舉例來說,如果你需要一個數字,你會使用

"\\d" 
2

如果你想表示一個Java字符串文字反斜槓,你需要用一個反斜槓逃逸,所以字符串文字"\\s"兩個個字符,\s。這意味着要在Java字符串文本中表示正則表達式[\d\s][\d]\.,您可以使用"[\\d\\s][\\d]\\."

請注意,我也對您的正則表達式進行了輕微修改,[\d|\s]將匹配數字,空格或文字|字符。你只想要[\d\s]。一個字符類已經意味着「匹配其中之一」,因爲你不需要|在字符類內進行交替,所以失去了它的特殊含義。