• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            教程精選:正則表達(dá)式快速入門(五)

            作者:開心石頭

              在上一篇文章里,我們介紹了正則表達(dá)式中的遞歸與替換,現(xiàn)在讓我們接觸一個(gè)學(xué)習(xí)正則表達(dá)式時(shí)方便測試使用的工具,并介紹一些正則表達(dá)式的編寫思路。

              一個(gè)學(xué)習(xí)正則表達(dá)式的便捷工具

              學(xué)習(xí)正則表達(dá)式最好的方法當(dāng)然是實(shí)踐,不過支持正則表達(dá)式的工具雖多,但如果僅僅用來做練習(xí)卻不是很方便。

              這里我向一家推薦一款專門的正則表達(dá)式編寫測試工具,PHPEdit公司的Regular Expression Editor工具。這是一個(gè)免費(fèi)軟件,主要用來調(diào)試PHP使用的Perl兼容正則表達(dá)式函數(shù)。使用它可以方便的輸入目標(biāo)字符串和正則表達(dá)式,并實(shí)時(shí)看到匹配的結(jié)果。可以到它的下載網(wǎng)頁去下載這個(gè)工具。

              程序的界面非常簡明,不過使用中發(fā)現(xiàn),它的一些功能使用起來好像有問題,只有preg_match_all和preg_replace功能正常,另外在匹配模式輸入框中,不要加模式定界符,程序好像把該輸入框中的全部內(nèi)容都作為模式來解析。

              好在做為一個(gè)正則表達(dá)式的練習(xí)工具,它的功能是足夠了,下面是它的運(yùn)行界面。


            程序運(yùn)行界面

              文中提到的各個(gè)例子都可以在里面進(jìn)行測試,在最上面的框里輸入模式,把目標(biāo)字符串寫進(jìn)中間的輸入框,點(diǎn)擊“run the regxwp”按鈕可以在下面得到匹配結(jié)果。

              正則表達(dá)式的編寫思路

              一個(gè)避免過多匹配的小技巧

              前面我們已經(jīng)多此談到書寫不合理的正則表達(dá)式引起過多匹配的問題,現(xiàn)在的問題是,如何可以盡量避免類似的情況發(fā)生。這里有個(gè)小小的技巧。

              如果你發(fā)現(xiàn)你定制模式匹配了過多的結(jié)果,一個(gè)好的方法是換個(gè)思路,與其考慮我的模式下一步需要匹配什么,不如考慮我的模式下一步需要避免匹配什么。我們可以用元字答“^”和字符類很容易的達(dá)成這種效果,這常常可以得到更精確的匹配。

              為了說明這種思路的好處我們先來舉一個(gè)與正則表達(dá)式無關(guān)的例子,考慮這樣一個(gè)問題,你把一個(gè)骰子一次拋出6的概率是六分之一,如果讓你擲六次,擲出一個(gè)6的概率是多少呢?

              可能有人會(huì)這么算,一次的概率是1/6,六次是就是6個(gè)1/6,加起來等于1。這個(gè)結(jié)果明顯是錯(cuò)的,雖然你擲了六次,但肯定不能保證必然會(huì)擲出一個(gè)6。從正向的思路解這道題看上去有點(diǎn)難。

              如果我們換個(gè)思路,解決的方法就明確多了。我們可以把這個(gè)題的問法改成這樣,如果讓你擲6次骰子,每一次都擲不出6的概率是多少?這個(gè)問題就好解多了,根據(jù)概率的乘法原理,每一次擲出不是6的點(diǎn)數(shù)的概率是5/6,而6次中每一次都不是6的概率是5/6的6次方,大概等于33%的樣子,然后用1減去這個(gè)數(shù)字就可以得到我們需要的答案。

              你可以把模式中每部分的匹配看作擲一次骰子的過程,每一部分的匹配概率與總匹配概率的情況與我們上面這個(gè)例子非常相似。

              如何提高正則表達(dá)式的解析效率

              對(duì)同樣匹配內(nèi)容的正則表達(dá)式而言,一些模式往往比另外一些模式更有效率。舉一個(gè)簡單的例子,使用字符類“[aeiou]”會(huì)比使用分支選擇型模式“(a|e|i|o|u).”更有效,一般而言,使用盡可能簡單和基本的模式通過會(huì)得到更高的效率。

              應(yīng)該盡可能的慎用相互嵌套的無限重復(fù)量詞,當(dāng)遇到不匹配的目標(biāo)字符串時(shí),對(duì)字符串的解析有可能花掉很可觀的時(shí)間。比如下面這個(gè)模式片斷“(a+)*”,當(dāng)遇到不匹配的目標(biāo)字符串“aaaa”時(shí),解析器會(huì)對(duì)它嘗試33種不同的匹配方法,這個(gè)數(shù)目會(huì)隨不匹配字符串長度的增加而極快的增長。

              一些正則表達(dá)式工具對(duì)一些特定的模式匹配進(jìn)行了優(yōu)化以提高效率,了解你使用的正則表達(dá)式工作做過些什么優(yōu)化并盡可能利用經(jīng)過優(yōu)化的模式可以大大提高你的正則表達(dá)式執(zhí)行效率。例如,PHP對(duì)形如/a+)*b /這樣的模式的解析進(jìn)行了優(yōu)化,當(dāng)模式結(jié)尾是一個(gè)確定的字符時(shí),解析器會(huì)先查找目標(biāo)的結(jié)尾是否符合模式,如果否則立刻返回失敗的匹配結(jié)果并停止解析。如果將上面的樣式改為“(a+)*\d”時(shí),因?yàn)榻Y(jié)尾不再是一個(gè)確定的字符,此模式會(huì)按正常的過程解析。如果你想看一下兩者效果的差異,你在我們前面提到的工具中,把目標(biāo)字符串設(shè)置成25個(gè)小寫的a字符,然后分別測試兩個(gè)模式,前者立刻就結(jié)束了,而后者需要等待約一秒(筆者使用的是XP1700+處理器)。

              除了盡可能利用經(jīng)過優(yōu)化的模式,對(duì)一些模式進(jìn)行重新構(gòu)造也可以大大提高效率。我們在介紹后向斷言時(shí)介紹過的那個(gè)利用后向斷言結(jié)合一次性子模式匹配結(jié)尾的字符的方法就是一個(gè)很好的例子。

              這里我們準(zhǔn)備結(jié)束這個(gè)教程,由于篇幅和本人水平的限制文中可能會(huì)有很多疏漏,還要請(qǐng)求大家諒解。對(duì)正則表達(dá)式介紹最全面的可能還是Perl相關(guān)的一些文檔和著作,如果想對(duì)正則表達(dá)式進(jìn)行更深入的了解可以參看Jeffrey Friedl 寫的“Mastering Regular Expressions”一書,里面有很多例子。不過我覺得在了解正則表達(dá)式基本概念后,還是仔細(xì)讀一下自己經(jīng)常使用的相關(guān)工具里的正則表達(dá)式相關(guān)部分更實(shí)用一些,最后,還是那句話,實(shí)踐出真知,希望大家在不斷實(shí)踐中更好的掌握正則表達(dá)式的使用。

            posted on 2007-04-22 17:21 PeakGao 閱讀(224) 評(píng)論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            <2007年4月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(9)

            隨筆分類(67)

            隨筆檔案(65)

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            99精品久久精品一区二区| 人人狠狠综合久久88成人| 精品国产热久久久福利| 无码人妻久久一区二区三区蜜桃| 思思久久99热只有频精品66| 亚洲中文久久精品无码| 国产精品久久毛片完整版| 四虎国产精品免费久久| 国产精品久久久久国产A级| 久久青青国产| 久久久久国产精品| 亚洲中文字幕无码久久2017| 日本福利片国产午夜久久| 久久精品国产精品亚洲精品| 99久久国产热无码精品免费| 久久免费视频1| 狠狠人妻久久久久久综合| 日韩精品久久久久久免费| 亚洲а∨天堂久久精品| 久久精品成人国产午夜| 狠狠色狠狠色综合久久| 午夜精品久久久久久久无码| 国产免费久久精品丫丫| 久久精品人人做人人爽电影蜜月| 亚洲欧美久久久久9999| 久久免费观看视频| 久久亚洲2019中文字幕| 国产福利电影一区二区三区,免费久久久久久久精 | 欧洲精品久久久av无码电影| 久久久久女教师免费一区| 一本大道久久a久久精品综合| 奇米综合四色77777久久| 久久狠狠爱亚洲综合影院| 亚洲国产成人精品女人久久久 | 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 久久天天躁狠狠躁夜夜2020一| 爱做久久久久久| 精品熟女少妇aⅴ免费久久| 精品久久久久久综合日本| 亚洲精品高清久久| 国产精品免费久久久久电影网|