2012-01-08 76 views
5

我想了解這個正則表達式,你能幫我嗎?正則表達式,我不明白

(?s)\\{\\{wotd\\|(.+?)\\|(.+?)\\|([^#\\|]+).*?\\}\\} 
  • 我真的不明白DOTALL的含義:(?s)
  • 爲什麼雙\\}
  • 是什麼恰恰意味着:(.+?)(我們應該閱讀這樣的:作用於..,然後+,然後?響應的.+
+4

在你看到這個源,它是在一個字符串?例如,它真的是'Pattern p = Pattern.compile(「(?s)\\ {\\ {wotd \\ |(。+?)\\ |(。+?)\\ |([^#\\ |] +)* \\} \\}「);'?它很重要,因爲反斜槓在字符串文字和正則表達式中都是逃逸的,所以爲了解釋'\\ {'我們需要知道是否是''\\ {「'(在這種情況下'\\'模式編譯器作爲一個單一的反斜槓,它轉義下面的''''或它的'\\ {'(例如,從文本文件或其他東西讀取),在這種情況下,模式編譯器會看到一個* escapeped * {'。 – 2012-01-08 15:09:28

+0

'。+?'是一個非貪婪(「不情願」)'+'操作符。 '\\\'表示一個文字反斜槓,假設正則表達式是Java並嵌入到Java字符串中,則第一個'\\'會轉義第二個。 – 2012-01-08 15:10:09

回答

8

這正則表達式是一個字符串的結果? 「規範」正則表達式是:

(?s)\{\{wotd\|(.+?)\|(.+?)\|([^#\|]+).*?\}\} 

的DOTALL修飾符意味着該點也可以匹配換行符,但所以補充字符類,至少與Java:即[^a]會匹配每個不是a的字符,包括換行符。一些正則表達式引擎在補充字符類中不匹配換行符(這可以被看作是一個bug)。

+?*?是惰性量詞(通常應該避免)。這意味着他們必須在他們想要吞下的每個角色之前向前看,看看這個角色是否能夠滿足正則表達式的下一個組成部分。

{}之前是\這一事實是因爲{...}是重複量詞{n,m},其中n和m是整數。

此外,在字符類[^#\|]中逃離管道|是無用的,它可以簡寫爲[^#|]

最後,.*?最後似乎吞噬了其餘的字段。更好的選擇是使用normal* (special normal*)*模式,其中normal[^|}]special\|

這裏是沒有使用懶惰量詞的正則表達式,「固定」字符類和修改後的結尾。需要注意的是,DOTALL修飾符已經消失爲好,因爲點不再使用:一步

\{\{wotd\|([^|]+)\|([^|]+)\|([^#|]+)[^|}]*(?:\|[^|}]*)*\}\} 

步驟:

\{\{   # literal "{{", followed by 
wotd   # literal "wotd", followed by 
\|   # literal "|", followed by 
([^|]+)  # one or more characters which are not a "|" (captured), followed by 
\|   # literal "|", followed by 
([^|]+)  # one or more characters which are not a "|" (captured), followed by 
\|   # literal "|", followed by 
([^#|]+)  # one or more characters which are not "|" or "#", followed by 
[^|}]*  # zero or more characters which are not "|" or "}", followed by 
(?:   # begin group 
    \|   # a literal "|", followed by 
    [^|}]*  # zero or more characters which are not "|" or "}" 
)   # end group 
*   # zero or more times, followed by 
\}\}   # literal "}}" 
+0

爲什麼建議避免懶惰的量詞? – Lucero 2012-01-08 15:20:53

+0

應該指出,你的正則表達式不等於原來的;原件將匹配你不會的許多字符串。如果我不得不猜測,我會猜測你的版本更接近正則表達式編寫者的原意,但不知道需求是什麼,沒有辦法知道確切的。 (順便說一句,你可以從你的版本中刪除'(?s)',因爲你的版本不會使用'.' – ruakh 2012-01-08 15:22:51

+0

沒有最後的'。*?'有意義,因爲其他管道也逃脫(你最終的正則表達式下降)。正則表達式正在尋找一個字符串,其中管道用作各種字段的分隔符:'{wotd | field1 | field2 | some_stuff#可能是一個評論?]' – user268396 2012-01-08 15:23:24