2012-05-27 81 views
3

我最近開始在Java中使用正則表達式,並且遇到了一個奇怪的表達式。正則表達式中的雙正斜槓

該問題要求找到僅由字母和最多一個結束句點組成的「單詞」。 因此,舉例來說,如果我輸入字符串:

one two. wr7ng not1 three. nope.. 

發動機將發現一,二,三成匹配的單詞。給定的解決方案是這樣的模式:

for (String tok : s.split(" ")) { 
    if (tok.matches("[a-zA-Z]+//.?")) { 
    // code done to record successful match 
    } 
} 

這兩個正斜槓是什麼意思?我將這個表達與這一個進行了比較:

[a-zA-Z]+.? 

並且在最後的時間段(期間)只發現了後面錯誤接受的數字。這是唯一的區別嗎?

+1

也許這是一個錯字他們應該是反斜槓。正則表達式中的正斜槓並不是正則表達式中的特殊字符,但是'.'並且像使用普通的''.''一樣使用它,所以你必須逃避它。 –

回答

5

您確定不是反斜槓?在一個字符串

"[a-zA-Z]+\\.?" 

兩個反斜槓被解釋爲,「插入文本字符串一個反斜槓」。 (按照慣例,在許多語言中,反斜線意味着「插入anychar」)。

當文字串被解釋爲正則表達式, 實際文本

  \. 

手段,「匹配‘期間’作爲文字字符」。

如果您沒有反斜槓「轉義字符」,大多數正則表達式引擎意思是「匹配任何字符」。

+0

好吧,我明白你在說什麼。感謝您清理這個! – jahmezz

1

正斜槓在正則表達式中沒有特殊含義,所以「//」表示匹配兩個正斜槓。

如果這沒有意義,這可能是一個錯字,或者你錯誤或錯誤地轉錄了正則表達式。更換着明顯的「修正」與反斜槓反斜槓給出了這樣的:

tok.matches("[a-zA-Z]+\\.?") 

這意味着「匹配羅馬字母后面跟着一個可選'.'」。在上下文中,可能是表示一個英文單詞,後跟一個完整的句號/句點。


對於記錄,"[a-zA-Z]+.?"匹配1個或多個羅馬字母,接着(任選地)由一個或多個字符。 +運算符的「渴望」意味着可選字符將是非字母...如果有的話。

2

看起來你有一個錯字。它應該是"[a-zA-Z]+\\."

該字符串值將成爲正則表達式值[a-zA-Z]+\.。反斜槓表示.應被視爲文字時期。沒有它,.是一個特殊的正則表達式元字符,匹配任何單個字符(包括數字)。

1

使用.(點)將被解釋爲正則表達式元字符,意思是「任何字符」。

使用\.會給出編譯器錯誤,非法轉義字符

使用\\.將被解釋爲簡單的.(點)字符,這是您需要使用的字符。

因此,對於只包含字母的單詞,您使用[a-zA-Z]+,其中+(加號)是一個量詞,意思是「一個或多個」。

對於單個.(點)字符,您使用\\.。 現在對於.(點)字符的「最後一次」部分,您將使用?量詞,意思是「一個或多個」。您對.零件的表達式變爲\\.?

因此,您的正則表達式將是[a-zA-Z]+\\.?

2

確切的RE是:

[a-zA-Z]+\.? 

,並編譯它使用Java,你還需要一個反斜槓\這意味着轉義字符在Java字符串:

"[a-zA-Z]+\\.?" 
相關問題