閱讀431 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《正則表達式經典實例(第2版)》——2.18 向正則表達式中添加注釋

本節書摘來自異步社區《正則表達式經典實例(第2版)》一書中的第2章,第2.18節,作者: 【美】Jan Goyvaerts , Steven Levithan著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看

2.18 向正則表達式中添加注釋

問題描述
‹\d{4}-\d{2}-\d{2}›可以匹配一個yyyy-mm-dd形式的日期,但是不會對數字做任何檢查。當你知道數據中不會包含非法日期時,這樣一個簡單的正則表達式就夠用了。試著在該正則表達式中添加注釋來說明該正則表達式的每個部分的含義。

解決方案

\d{4}   # Year
-        # Separator

\d{2}   # Month
-        # Separator

\d{2}   # Day
正則選項:寬鬆排列 
正則流派:.NET、Java、XRegExp、PCRE、Perl、Python、Ruby

討論
寬鬆排列模式
正則表達式很容易變得複雜無比並且難以理解。源代碼中應該添加注釋,所以隻要正則表達式稍微複雜一點,你也應該在其中添加注釋。

本書中除了JavaScript之外的所有正則表達式流派,都提供了某種形式的正則表達式語法來幫助你很容易清晰地注釋正則表達式。你可以通過開啟寬鬆排列(free-spacing)模式來應用這種語法。在不同的編程語言中它可能會有不同的名稱。

在.NET中,需要設置RegexOptions.IgnorePatternWhitespace選項。而在Java中,則要傳遞Pattern.COMMENTS標誌。Python用的是re.VERBOSE。PHP、Perl和Ruby則使用/x標誌。

盡管標準JavaScript並不支持寬鬆排列,但XRegExp庫添加了這個選項。隻需在XRegExp()構造器第二個參數標誌中添加'x'即可。

打開寬鬆排列模式會產生兩個效果。首先,它會把位於字符組之外的井號(#)轉變成一個元字符。井號會作為一個注釋的開始,該注釋的結尾是一行的結束或者該正則表達式的結束(取二者中先到的那個)。井號以及其後的所有內容都會被正則表達式引擎直接忽略。如果要匹配一個字麵上的井號字符,必須把它放到一個字符組‹[#]›中,或者把它轉義為‹#›。

寬鬆排列模式的另外一個效果是:位於字符組之外的所有空白字符,包括空格、製表符和換行符,都會被忽略。要想匹配一個字麵上的空格,就需要把它放到字符組‹[●]›中,或者把它轉義為‹\●›。如果你更關心可讀性的話,那麼也可以選擇使用十六進製數的轉義形式‹\x20›,或者是Unicode轉義形式‹\u0020›或‹\x{0020}›來代替。如果要匹配一個製表符,則應該使用‹\t›。至於換行符,則可以使用‹\r\n›(Windows)或者‹\n›(Unix、Linux、OS X)。

寬鬆排列模式並不會改變位於字符組之內的任何內容。一個字符組可以看作是單個記號。位於字符組之內的任意空白字符或者井號都是被添加到字符組中的字麵字符。打斷字符組來對其中的某個部分進行注釋是不允許的。

Java中的寬鬆排列字符組
如果完全不存在與其他不兼容的流派,正則表達式的複雜性也不會讓人談之生變。在這裏,不兼容的那個流派就是Java。

在Java中,字符組並不作為單個記號來進行分析。如果你打開了寬鬆排列模式,那麼Java就會忽略字符組中的空格,而且在字符組中的井號也意味著注釋的開始。這就意味著,你不能使用‹[●]›和‹[#]›來字麵匹配這些字符。使用‹\u0020›和‹#›作為替代。

變體

(?#Year)\d{4}(?#Separator)-(?#Month)\d{2}-(?#Day)\d{2}
正則選項:無
正則流派:.NET、XRegExp、PCRE、Perl、Python、Ruby

不管是出於什麼原因,如果你不能或者是不想使用寬鬆排列語法,那麼還可以通過‹(?#comment)›的方式添加注釋。在‹(?#›和‹)›之間的所有字符都會被忽略。

不幸的是,JavaScript,也就是本書中講到的流派中唯一不支持寬鬆排列的流派,同樣也不支持這種注釋語法。XRegExp為JavaScript添加了寬鬆排列支持,同樣也添加了這種注釋語法支持。而Java支持寬鬆排列模式下添加注釋,卻不支持‹(?#comment)›這種語法。

(?x)\d{4}   # Year
-              # Separator

\d{2}         # Month
-              # Separator

\d{2}         # Day
正則選項:無
正則流派:.NET、Java、XRegExp、PCRE、Perl、Python、Ruby

如果不能在正則表達式之外啟用寬鬆排列模式,那麼你可以把模式修飾符‹(?x)›放到正則表達式的最開始處。確保‹(?x)›之前不存在任何空格。因為隻有在這個模式修飾符之後才會開始寬鬆排列模式,因此在它之前的任意空格都是不能忽略的。

最後更新:2017-06-02 19:35:56

  上一篇:go  《正則表達式經典實例(第2版)》——2.19 在替代文本中添加字麵文本
  下一篇:go  《正則表達式經典實例(第2版)》——2.17 根據條件匹配兩者之一