全面分析LinuxRegex(六)

來源:互聯網
上載者:User

通過前面幾篇文章的介紹我們對LinuxRegex應該有了一個相對較全面的認識,對於LinuxRegex具體應該怎麼用,現在讓我們接觸一個學習Regex時方便測試使用的工具,並介紹一些Regex的編寫思路。

一個學習Regex的便捷工具

學習Regex最好的方法當然是實踐,不過支援Regex的工具雖多,但如果僅僅用來做練習卻不是很方便。
這裡我向一家推薦一款專門的Regex編寫測試載入器,PHPEdit公司的Regular Expression Editor工具。這是一個免費軟體,主要用來調試PHP使用的Perl相容Regex函數。使用它可以方便的輸入目標字串和Regex,並即時看到匹配的結果。可以到它的下載網頁去下載這個工具。
程式的介面非常簡明,不過使用中發現,它的一些功能使用起來好像有問題,只有preg_match_all和preg_replace功能正常,另外在匹配模式輸入框中,不要加模式定界符,程式好像把該輸入框中的全部內容都作為模式來解析。
好在做為一個Regex的練習工具,它的功能是足夠了。
文中提到的各個例子都可以在裡面進行測試,在最上面的框裡輸入模式,把目標字串寫進中間的輸入框,點擊“run the regxwp”按鈕可以在下面得到匹配結果。

Regex的編寫思路

一個避免過多匹配的小技巧
前面我們已經多此談到書寫不合理的Regex引起過多匹配的問題,現在的問題是,如何可以盡量避免類似的情況發生。這裡有個小小的技巧。
如果你發現你定製模式比對了過多的結果,一個好的方法是換個思路,與其考慮我的模式下一步需要匹配什麼,不如考慮我的模式下一步需要避免匹配什麼。我們可以用元字答“^”和字元類很容易的達成這種效果,這常常可以得到更精確的匹配。
為了說明這種思路的好處我們先來舉一個與Regex無關的例子,考慮這樣一個問題,你把一個骰子一次拋出6的機率是六分之一,如果讓你擲六次,擲出一個6的機率是多少呢?
可能有人會這麼算,一次的機率是1/6,六次是就是6個1/6,加起來等於1。這個結果明顯是錯的,雖然你擲了六次,但肯定不能保證必然會擲出一個6。從正向的思路解這道題看上去有點難。
如果我們換個思路,解決的方法就明確多了。我們可以把這個題的問法改成這樣,如果讓你擲6次骰子,每一次都擲不出6的機率是多少?這個問題就好解多了,根據機率的乘法原理,每一次擲出不是6的點數的機率是5/6,而6次中每一次都不是6的機率是5/6的6次方,大概等於33%的樣子,然後用1減去這個數字就可以得到我們需要的答案。
你可以把模式中每部分的匹配看作擲一次骰子的過程,每一部分的匹配機率與總匹配機率的情況與我們上面這個例子非常相似。
如何提高Regex的解析效率
對同樣匹配內容的Regex而言,一些模式往往比另外一些模式更有效率。舉一個簡單的例子,使用字元類“[aeiou]”會比使用分支選擇型模式“(a|e|i|o|u).”更有效,一般而言,使用儘可能簡單和基本的模式通過會得到更高的效率。
應該儘可能的慎用相互嵌套的無限重複量詞,當遇到不匹配的目標字串時,對字串的解析有可能花掉很可觀的時間。比如下面這個模式片斷“(a+)*”,當遇到不匹配的目標字串“aaaa”時,解析器會對它嘗試33種不同的匹配方法,這個數目會隨不匹配字串長度的增加而極快的增長。
一些Regex工具對一些特定的模式比對進行了最佳化以提高效率,瞭解你使用的Regex工作做過些什麼最佳化並儘可能利用經過最佳化的模式可以大大提高你的Regex執行效率。例如,PHP對形如/a+)*b /這樣的模式的解析進行了最佳化,當模式結尾是一個確定的字元時,解析器會先尋找目標的結尾是否符合模式,如果否則立刻返回失敗的匹配結果並停止解析。如果將上面的樣式改為“(a+)*d”時,因為結尾不再是一個確定的字元,此模式會按正常的過程解析。如果你想看一下兩者效果的差異,你在我們前面提到的工具中,把目標字串設定成25個小寫a字元,然後分別測試兩個模式,前者立刻就結束了,而後者需要等待約一秒(筆者使用的是XP1700+處理器)。
除了儘可能利用經過最佳化的模式,對一些模式進行重新構造也可以大大提高效率。我們在介紹後向斷言時介紹過的那個利用後向斷言結合一次性子模式比對結尾的字元的方法就是一個很好的例子。
這裡我們準備結束這個教程,由於篇幅和本人水平的限制文中可能會有很多疏漏,還要請求大家諒解。對Regex介紹最全面的可能還是Perl相關的一些文檔和著作,如果想對Regex進行更深入的瞭解可以參看Jeffrey Friedl 寫的“Mastering Regular Expressions”一書,裡面有很多例子。不過我覺得在瞭解Regex基本概念後,還是仔細讀一下自己經常使用的相關工具裡的Regex相關部分更實用一些,最後,還是那句話,實踐出真知,希望大家在不斷實踐中更好的掌握Regex的使用

  1. 全面分析LinuxRegex一)
  2. 全面分析LinuxRegex五)
  3. 詳細剖析Linux伺服器安全防護十個方面
  4. 怎樣處理Linux死機
  5. 詳細介紹LinuxYUM常用命令

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.