正则表达式入门教程-连载(4)-点符号(.)
點符號(.)匹配幾乎任何字符
在正則表達式中,點符號.是最常用的元字符,也是最被濫用的元字符。
點符號.匹配單個字符,不管是什么字符,為一的例外就是換行符。本教程中所涉及到的正則表達式,點符號.默認情況下不會匹配一個換行符,所以這點符號.其實就是[^\n](Unix環境下)或者[^\r\n] (Windows 環境下)的簡寫。
這個例外的存在最可能是由于歷史原因。第一個正則表達式工具是基于行的,他們一行一行的讀文件,每一行各自去匹配正則表達式。這個影響就是,使用這些工具,字符串中不會出現換行符,所以點符號.不會去匹配他們。現在的工具和語言可以讓正則表達式作用于大字符串甚至整個文件。本教程中討論的正則表達式都能設置成使之匹配包括換行符。 在RegexBuddy, EditPad Pro 或者 PowerGREP中,只需勾選中選項"dot matches newline"。
在Perl中,匹配換行符的模式稱作單行模式。有點不幸的是,這很容易和術語“多行模式“搞混。多行模式只影響錨,單行模式只影響點符號(.)。你可通過在正則表達式后面加上一個s來激活單行模式,例如m/^regex$/s。
其他語言和正則表達式也采用了Perl的術語。當使用.NET的正則表達式庫的時候,需要通過指定RegexOptions.Singleline激活單行模式。例如Regex.Match("string", "regex", RegexOptions.Singleline).
在我所知的程序語言和正則表達式庫中,激活單行模式除了讓點符號匹配換行符之外沒有別的效用。
javascript和VBScript沒有讓點符號.匹配換行符的選項。著這些語言里,你可以使用字符集,比如 [\s\S] 來匹配任意字符。這個字符集匹配一個空白符包括換行符或者不是空白符,這就邏輯上等于匹配了任何字符。
?保守的使用點符號點符號.
點符號.是一個強力的正則字符,讓你變懶。但是點符號.也會讓你匹配不該匹配的字符。如果你初學正則表達式,最初的一些情況你可能不是很清楚。
舉例說明。比如要匹配日期mm/dd/yy,但是允許用戶自己選擇分隔符。快速的解決方法是\d\d.\d\d.\d\d.。看上去不錯,會匹配02/12/03 。但是麻煩是,它也會匹配02512703,這不是我們想看到的。
\d\d[- /.]\d\d[- /.]\d\d 才是較好的解決方案。注意,點符號.在字符集中不屬于元字符,所以你不需要轉義。
但這個正則表達式仍然不完美,因為她匹配99/99/99,[0-1]\d[- /.][0-3]\d[- /.]\d\d稍微完美一點,但是它匹配19/39/99。要多完美,取決于想怎么做。如果用來驗證用戶輸入,這不完美。如果用來轉換數據文件,這個可能就足夠。
使用否定的字符集替代點符號.假設你想要匹配一個引號包括的字符串,聽起來簡單。引號里包含任何個數的任何字符,".*"似乎很不錯,點符號.匹配任何字符,星號*表示重復任何次數,包括0,如果你把正則表達式應用于Put a "string" between double quotes這句話,很好的匹配"string"。如果應用于 Houston, we have a problem with "string one" and "string two". Please respond.那么匹配的是?"string one" and "string two"。不是我們想要的,因為星號*是貪婪的。
在日期匹配的例子中,我們用字符集替代點符號來改善正則表達式,這里我們也是相同做法。對于雙引號內的字符串的定義是錯誤的。不想讓任何字符以任何次數的形式出現在引號中,而是希望任何不是雙引號和換行符的字符以任何次數的形式出現在雙引號內。所以恰當的正則表達式是"[^"\r\n]*"。
總結
以上是生活随笔為你收集整理的正则表达式入门教程-连载(4)-点符号(.)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Socket编程实践(1) --TCP/
- 下一篇: openstack前世今生