亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Regex > 正文

如何寫出高效率的正則表達式

2024-09-07 17:40:10
字體:
來源:轉載
供稿:網友

很多程序員在編寫程序的時候都會只考慮如何能盡快把活干完,很少去考慮如何將代碼變得更完美,更高效,那么你知道如何寫出高效率的正則表達式嗎?下面我們就一起去學習學習。

如果純粹是為了挑戰自己的正則水平,用來實現一些特效(例如使用正則表達式計算質數、解線性方程),效率不是問題;如果所寫的正則表達式只是為了滿足一兩次、幾十次的運行,優化與否區別也不太大。但是,如果所寫的正則表達式會百萬次、千萬次地運行,效率就是很大的問題了。

?為行文方便,先定義兩個概念。
誤匹配:指正則表達式所匹配的內容范圍超出了所需要范圍,有些文本明明不符合要求,但是被所寫的正則式“擊中了”。例如,如果使用/d{11}來匹配11位的手機號,/d{11}不單能匹配正確的手機號,它還會匹配98765432100這樣的明顯不是手機號的字符串。我們把這樣的匹配稱之為誤匹配。
漏匹配:指正則表達式所匹配的內容所規定的范圍太狹窄,有些文本確實是所需要的,但是所寫的正則沒有將這種情況囊括在內。例如,使用/d{18}來匹配18位的身份證號碼,就會漏掉結尾是字母X的情況。
寫出一條正則表達式,既可能只出現誤匹配(條件寫得極寬松,其范圍大于目標文本),也可能只出現漏匹配(只描述了目標文本中多種情況種的一種),還可能既有誤匹配又有漏匹配。例如,使用/w+/.com來匹配.com結尾的域名,既會誤匹配abc_.com這樣的字串(合法的域名中不含下劃線,/w包含了下劃線這種情況),又會漏掉ab-c.com這樣的域名(合法域名中可以含中劃線,但是/w不匹配中劃線)。
精準的正則表達式意味著既無誤匹配且無漏匹配。當然,現實中存在這樣的情況:只能看到有限數量的文本,根據這些文本寫規則,但是這些規則將會用到海量的文本中。這種情況下,盡可能地(如果不是完全地)消除誤匹配以及漏匹配,并提升運行效率,就是我們的目標。本文所提出的經驗,主要是針對這種情況。
掌握語法細節。正則表達式在各種語言中,其語法大致相同,細節各有千秋。明確所使用語言的正則的語法的細節,是寫出正確、高效正則表達式的基礎。例如,perl中與/w等效的匹配范圍是[a-zA-Z0-9_];perl正則式不支持肯定逆序環視中使用可變的重復(variable repetition inside lookbehind,例如(?<=.*)abc),但是.Net語法是支持這一特性的;又如,JavaScript連逆序環視(Lookbehind,如(?<=ab)c)都不支持,而perl和python是支持的。《精通正則表達式》第3章《正則表達式的特性和流派概覽》明確地列出了各大派系正則的異同,這篇文章也簡要地列出了幾種常用語言、工具中正則的比較。對于具體使用者而言,至少應該詳細了解正在使用的那種工作語言里正則的語法細節。
先粗后精,先加后減。使用正則表達式語法對于目標文本進行描述和界定,可以像畫素描一樣,先大致勾勒出框架,再逐步在局步實現細節。仍舉剛才的手機號的例子,先界定/d{11},總不會錯;再細化為1[358]/d{9},就向前邁了一大步(至于第二位是不是3、5、8,這里無意深究,只舉這樣一個例子,說明逐步細化的過程)。這樣做的目的是先消除漏匹配(剛開始先盡可能多地匹配,做加法),然后再一點一點地消除誤匹配(做減法)。這樣有先有后,在考慮時才不易出錯,從而向“不誤不漏”這個目標邁進。
留有余地。所能看到的文本sample是有限的,而待匹配檢驗的文本是海量的,暫時不可見的。對于這樣的情況,在寫正則表達式時要跳出所能見到的文本的圈子,開拓思路,作出“戰略性前瞻”。例如,經常收到這樣的垃圾短信:“發*票”、“發#漂”。如果要寫規則屏蔽這樣煩人的垃圾短信,不但要能寫出可以匹配當前文本的正則表達式 發[*#](?:票|漂),還要能夠想到 發.(?:票|漂|飄)之類可能出現的“變種”。這在具體的領域或許會有針對性的規則,不多言。這樣做的目的是消除漏匹配,延長正則表達式的生命周期。
明確。具體說來,就是謹慎用點號這樣的元字符,盡可能不用星號和加號這樣的任意量詞。只要能確定范圍的,例如/w,就不要用點號;只要能夠預測重復次數的,就不要用任意量詞。例如,寫析取twitter消息的腳本,假設一條消息的xml正文部分結構是<span class=”msg”>…</span>且正文中無尖括號,那么<span class=”msg”>[^<]{1,480}</span>這種寫法的思路要好于<span class=”msg”>.*</span>,原因有二:一是使用[^<],它保證了文本的范圍不會超出下一個小于號所在的位置;二是明確長度范圍,{1,480},其依據是一條twitter消息大致能的字符長度范圍。當然,480這個長度是否正確還可推敲,但是這種思路是值得借鑒的。說得狠一點,“濫用點號、星號和加號是不環保、不負責任的做法”。
不要讓稻草壓死駱駝。每使用一個普通括號()而不是非捕獲型括號(?:…),就會保留一部分內存等著你再次訪問。這樣的正則表達式、無限次地運行次數,無異于一根根稻草的堆加,終于能將駱駝壓死。養成合理使用(?:…)括號的習慣。
寧簡勿繁。將一條復雜的正則表達式拆分為兩條或多條簡單的正則表達式,編程難度會降低,運行效率會提升。例如用來消除行首和行尾空白字符的正則表達式s/^/s+|/s+$//g;,其運行效率理論上要低于s/^/s+//g; s//s+$//g; 。這個例子出自《精通正則表達式》第五章,書中對它的評論是“它幾乎總是最快的,而且顯然最容易理解”。既快又容易理解,何樂而不為?工作中我們還有其它的理由要將C==(A|B)這樣的正則表達式拆為A和B兩條表達式分別執行。例如,雖然A和B這兩種情況只要有一種能夠擊中所需要的文本模式就會成功匹配,但是如果只要有一條子表達式(例如A)會產生誤匹配,那么不論其它的子表達式(例如B)效率如何之高,范圍如何精準,C的總體精準度也會因A而受到影響。
巧妙定位。有時候,我們需要匹配的the,是作為單詞的the(兩邊有空格),而不是作為單詞一部分的t-h-e的有序排列(例如together中的the)。在適當的時候用上^,$,/b等等定位錨點,能有效提升找到成功匹配、淘汰不成功匹配的效率。

以上就是小編為大家總結如何寫出高效率的正則表達式的經驗,提高正則表達式效率的小竅門整理在這里。如果您有其它的經驗而這里沒有提及,歡迎討論。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲福利一区| 日韩av一区二区在线观看| 欧美亚洲国产成人精品| 久久99久国产精品黄毛片入口| 国产在线观看91精品一区| 中文在线资源观看视频网站免费不卡| 国产精品自产拍在线观| 日韩成人av一区| 中文字幕亚洲一区二区三区五十路| 国产综合久久久久久| 亚洲精品按摩视频| 亚洲一二在线观看| 97热在线精品视频在线观看| 国产亚洲人成a一在线v站| 日韩欧美综合在线视频| 日韩不卡在线观看| 亚洲a级在线观看| 日韩在线免费视频| 久久久999国产| 亚洲国产一区二区三区四区| 狠狠躁夜夜躁人人爽天天天天97| 色妞色视频一区二区三区四区| 91国内产香蕉| 亚洲第一在线视频| 中文字幕亚洲激情| 在线观看欧美日韩| 国产日韩在线观看av| 久久久久久久一区二区三区| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美激情中文字幕乱码免费| 国产欧美日韩中文字幕在线| 亚洲的天堂在线中文字幕| 日韩高清中文字幕| 亚洲欧美日韩成人| 亚洲色图欧美制服丝袜另类第一页| 日韩美女在线看| 亚洲最大av网| 高清亚洲成在人网站天堂| 青青精品视频播放| 精品国内产的精品视频在线观看| 97精品久久久中文字幕免费| 亚洲欧美日韩在线一区| 中文字幕免费国产精品| 欧美人在线视频| 欧美性高潮床叫视频| 91精品国产高清| 日韩a**中文字幕| 欧美性生交xxxxxdddd| 深夜福利一区二区| 国产成人一区三区| 久久久视频在线| 日韩中文字幕免费视频| 97成人精品视频在线观看| 国产精品亚洲аv天堂网| 欧美色道久久88综合亚洲精品| 欧美高清视频一区二区| 欧美性高跟鞋xxxxhd| 亚洲第一精品电影| 色樱桃影院亚洲精品影院| 91精品国产综合久久香蕉的用户体验| 欧美精品电影在线| 日本在线观看天堂男亚洲| 欧美丰满少妇xxxxx| 91久久精品一区| 日本国产欧美一区二区三区| 亚洲综合av影视| 亚洲福利视频久久| 国产精品日韩一区| 中文字幕免费精品一区| 一本色道久久综合狠狠躁篇怎么玩| 亚洲a中文字幕| 国产精品自拍小视频| 国产精品成人久久久久| 成人性生交大片免费看小说| 欧美精品一区二区免费| 亚洲另类激情图| 国产精品美女免费视频| 亚洲一区制服诱惑| 久久99精品久久久久久青青91| 亚洲性生活视频在线观看| 国内精品美女av在线播放| 97人人做人人爱| 欧美电影在线免费观看网站| 激情亚洲一区二区三区四区| 亚洲精品国产精品自产a区红杏吧| 自拍偷拍亚洲在线| 91精品国产九九九久久久亚洲| 国产综合香蕉五月婷在线| 尤物yw午夜国产精品视频| 亚洲天堂av电影| 福利精品视频在线| 亚洲在线观看视频| 国产不卡视频在线| 欧美性猛交xxxx久久久| 岛国av在线不卡| 国产在线视频2019最新视频| 色综合久久88色综合天天看泰| 高清欧美一区二区三区| 国产精品嫩草影院久久久| 亚洲欧美一区二区三区情侣bbw| 精品成人国产在线观看男人呻吟| 欧美成人黄色小视频| 亚洲成av人影院在线观看| 欧美日韩高清在线观看| 欧美人交a欧美精品| 国产伊人精品在线| 91福利视频网| 97精品视频在线| 欧美激情在线有限公司| 蜜臀久久99精品久久久久久宅男| 久久视频免费观看| 欧美性猛交丰臀xxxxx网站| 精品视频—区二区三区免费| 日本午夜人人精品| 国产精品男女猛烈高潮激情| 亚洲精品大尺度| 欧美一级高清免费| 日韩大片免费观看视频播放| 国产精品高潮视频| 日韩中文在线中文网在线观看| 亚洲性视频网站| 在线色欧美三级视频| 欧美精品激情视频| 国产精品视频男人的天堂| 国产精品自拍网| 亚洲一区二区三区视频| 国产小视频91| 久久久久久久一区二区三区| 97久久精品人搡人人玩| 亚洲国产精品成人va在线观看| 日本免费在线精品| 欧美亚州一区二区三区| 亚洲日韩欧美视频| 国产福利成人在线| 日韩电视剧在线观看免费网站| 日本成人在线视频网址| 亚洲免费av网址| 欧美激情视频在线观看| 亚洲一品av免费观看| 成人国产精品久久久久久亚洲| 久久精品国产99国产精品澳门| 久久久精品一区二区| 国产第一区电影| 日韩高清免费观看| 欧美综合第一页| 成人av在线天堂| 日韩av一区在线观看| 青青草原成人在线视频| 91中文在线视频| 欧美视频在线看| 91成人国产在线观看| 国产女人精品视频| 国产精品白嫩美女在线观看| 亚洲女人天堂色在线7777| 最近2019中文字幕大全第二页| 欧美高清性猛交| 最近中文字幕2019免费| 国产精品视频最多的网站| 久久久999国产| 国产亚洲一区二区在线| 一本大道亚洲视频| 97国产精品久久| 精品高清美女精品国产区| 97久久精品视频|