我想了解這個正則表達式,你能幫我嗎?正則表達式,我不明白
(?s)\\{\\{wotd\\|(.+?)\\|(.+?)\\|([^#\\|]+).*?\\}\\}
- 我真的不明白DOTALL的含義:
(?s)
- 爲什麼雙
\\
前}
? - 是什麼恰恰意味着:
(.+?)
(我們應該閱讀這樣的:作用於.
的.
,然後+
,然後?
響應的.+
我想了解這個正則表達式,你能幫我嗎?正則表達式,我不明白
(?s)\\{\\{wotd\\|(.+?)\\|(.+?)\\|([^#\\|]+).*?\\}\\}
(?s)
\\
前}
?(.+?)
(我們應該閱讀這樣的:作用於.
的.
,然後+
,然後?
響應的.+
這正則表達式是一個字符串的結果? 「規範」正則表達式是:
(?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 "}}"
爲什麼建議避免懶惰的量詞? – Lucero 2012-01-08 15:20:53
應該指出,你的正則表達式不等於原來的;原件將匹配你不會的許多字符串。如果我不得不猜測,我會猜測你的版本更接近正則表達式編寫者的原意,但不知道需求是什麼,沒有辦法知道確切的。 (順便說一句,你可以從你的版本中刪除'(?s)',因爲你的版本不會使用'.' – ruakh 2012-01-08 15:22:51
沒有最後的'。*?'有意義,因爲其他管道也逃脫(你最終的正則表達式下降)。正則表達式正在尋找一個字符串,其中管道用作各種字段的分隔符:'{wotd | field1 | field2 | some_stuff#可能是一個評論?]' – user268396 2012-01-08 15:23:24
在你看到這個源,它是在一個字符串?例如,它真的是'Pattern p = Pattern.compile(「(?s)\\ {\\ {wotd \\ |(。+?)\\ |(。+?)\\ |([^#\\ |] +)* \\} \\}「);'?它很重要,因爲反斜槓在字符串文字和正則表達式中都是逃逸的,所以爲了解釋'\\ {'我們需要知道是否是''\\ {「'(在這種情況下'\\'模式編譯器作爲一個單一的反斜槓,它轉義下面的''''或它的'\\ {'(例如,從文本文件或其他東西讀取),在這種情況下,模式編譯器會看到一個* escapeped * {'。 – 2012-01-08 15:09:28
'。+?'是一個非貪婪(「不情願」)'+'操作符。 '\\\'表示一個文字反斜槓,假設正則表達式是Java並嵌入到Java字符串中,則第一個'\\'會轉義第二個。 – 2012-01-08 15:10:09