資源描述:
《正則表達式(一)從初學到精通正則表達式》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、深入淺出之正則表達式(一)前言:???????半年前我對正則表達式產(chǎn)生了興趣,在網(wǎng)上查找過不少資料,看過不少的教程,最后在使用一個正則表達式工具RegexBuddy時發(fā)現(xiàn)他的教程寫的非常好,可以說是我目前見過最好的正則表達式教程。于是一直想把他翻譯過來。這個愿望直到這個五一長假才得以實現(xiàn),結(jié)果就有了這篇文章。關(guān)于本文的名字,使用“深入淺出”似乎已經(jīng)太俗。但是通讀原文以后,覺得只有用“深入淺出”才能準確的表達出該教程給我的感受,所以也就不能免俗了。??????本文是JanGoyvaerts為RegexBuddy寫的教程的譯文,版權(quán)歸原作者所有,歡迎轉(zhuǎn)載。但是為了尊重原作者和譯者的勞
2、動,請注明出處!謝謝!?1.?????什么是正則表達式基本說來,正則表達式是一種用來描述一定數(shù)量文本的模式。Regex代表RegularExpress。本文將用<>來表示一段具體的正則表達式。一段文本就是最基本的模式,簡單的匹配相同的文本。?2.?????不同的正則表達式引擎正則表達式引擎是一種可以處理正則表達式的軟件。通常,引擎是更大的應用程序的一部分。在軟件世界,不同的正則表達式并不互相兼容。本教程會集中討論Perl5類型的引擎,因為這種引擎是應用最廣泛的引擎。同時我們也會提到一些和其他引擎的區(qū)別。許多近代的引擎都很類似,但不完全一樣。例如.NET正則庫,JDK
3、正則包。?3.?????文字符號最基本的正則表達式由單個文字符號組成。如<>,它將匹配字符串中第一次出現(xiàn)的字符“a”。如對字符串“Jackisaboy”?!癑”后的“a”將被匹配。而第二個“a”將不會被匹配。正則表達式也可以匹配第二個“a”,這必須是你告訴正則表達式引擎從第一次匹配的地方開始搜索。在文本編輯器中,你可以使用“查找下一個”。在編程語言中,會有一個函數(shù)可以使你從前一次匹配的位置開始繼續(xù)向后搜索。類似的,<>會匹配“Aboutcatsanddogs”中的“cat”。這等于是告訴正則表達式引擎,找到一個<>,緊跟一個<>,再跟一個<>。要
4、注意,正則表達式引擎缺省是大小寫敏感的。除非你告訴引擎忽略大小寫,否則<>不會匹配“Cat”。?·???????特殊字符對于文字字符,有11個字符被保留作特殊用途。他們是:[]^$.
5、?*+()這些特殊字符也被稱作元字符。如果你想在正則表達式中將這些字符用作文本字符,你需要用反斜杠“”對其進行換碼(escape)。例如你想匹配“1+1=2”,正確的表達式為<<1+1=2>>.需要注意的是,<<1+1=2>>也是有效的正則表達式。但它不會匹配“1+1=2”,而會匹配“123+111=234”中的“111=2”。因為“+”在這里表示特殊含義(重復1次到多次)。在編程語
6、言中,要注意,一些特殊的字符會先被編譯器處理,然后再傳遞給正則引擎。因此正則表達式<<1+2=2>>在C++中要寫成“1\+1=2”。為了匹配“C:temp”,你要用正則表達式<>。而在C++中,正則表達式則變成了“C:\\temp”。?·???????不可顯示字符可以使用特殊字符序列來代表某些不可顯示字符:<>代表Tab(0x09)<>代表回車符(0x0D)<<>>代表換行符(0x0A)要注意的是Windows中文本文件使用“r”來結(jié)束一行而Unix使用“”。?4.?????正則表達式引擎的內(nèi)部工作機制知道正則表達式引
7、擎是如何工作的有助于你很快理解為何某個正則表達式不像你期望的那樣工作。有兩種類型的引擎:文本導向(text-directed)的引擎和正則導向(regex-directed)的引擎。JeffreyFriedl把他們稱作DFA和NFA引擎。本文談到的是正則導向的引擎。這是因為一些非常有用的特性,如“惰性”量詞(lazyquantifiers)和反向引用(backreferences),只能在正則導向的引擎中實現(xiàn)。所以毫不意外這種引擎是目前最流行的引擎。你可以輕易分辨出所使用的引擎是文本導向還是正則導向。如果反向引用或“惰性”量詞被實現(xiàn),則可以肯定你使用的引擎是正則導向的。你可以作如
8、下測試:將正則表達式<9、regexnot>>應用到字符串“regexnot”。如果匹配的結(jié)果是regex,則引擎是正則導向的。如果結(jié)果是regexnot,則是文本導向的。因為正則導向的引擎是“猴急”的,它會很急切的進行表功,報告它找到的第一個匹配。?·???????正則導向的引擎總是返回最左邊的匹配這是需要你理解的很重要的一點:即使以后有可能發(fā)現(xiàn)一個“更好”的匹配,正則導向的引擎也總是返回最左邊的匹配。當把<>應用到“Hecapturedacatfishfo