英文原文來自Smashing Magazine。由笨活兒翻譯。轉載請注明出處。
正則表達式(Regular Expression, abbr. regex) 功能強大,能夠用于在一大串字符里找到所需信息。它利用約定俗成的字符結構表達式來發(fā)生作用。不幸的是,簡單的正則表達式對于一些高級運用,功能遠遠不夠。若要進行篩選的結構比較復雜,你可能就需要用到高級正則表達式。
本文為您介紹正則表達式的高級技巧。我們篩選出了八個常用的概念,并配上實例解析,每個例子都是滿足某種復雜要求的簡單寫法。如果你對正則的基本概念尚缺乏了解,請先閱讀 這篇文章,或者 這個教程,或者維基條目。
這里的正則語法適用于PHP,與Perl兼容。
1. 貪婪/懶惰
所有能多次限定的正則運算符都是貪婪的。他們盡可能多地匹配目標字符串,也就是說匹配結果會盡可能地長。不幸的是,這種做法并不總是我們想要的。因此,我們添加“懶惰”限定符來解決問題。在各個貪婪運算符后添加“?”能讓表達式只匹配盡可能短的長度。另外,修改器“U”也能惰化能多次限定的運算符。理解貪婪與懶惰的區(qū)別是運用高級正則表達式的基礎。
貪婪操作符
操作符 * 匹配之前的表達式零次或零次以上。它是一個貪婪操作符。請看下面的例子:
preg_match( '/<h1>.*<\/h1>/' , '<h1>這是一個標題。</h1>
<h1>這是另一個。</h1>', $matches );
句點(.)能代表除換行符外的任意字符。上面的正則表達式匹配 h1 標簽以及標簽內(nèi)的所有內(nèi)容。它用句點(.)和星號(*)來匹配標簽內(nèi)的所有內(nèi)容。匹配結果如下:
<h1>這是一個標題。</h1><h1>這是另一個。</h1>
整個字串都被返回。* 操作符會連續(xù)匹配所有內(nèi)容—— 甚至包括中間的 h1 閉合標簽。因為它是貪婪的,匹配整個字串是符合其利益最大化原則。
懶惰操作符
把上面的式子稍作修改,加上一個問號(?),能讓表達式變懶惰:
/<h1>.*?<\/h1>/
這樣它會覺得,只需匹配到第一個 h1 結尾標簽就完成任務了。
另一個有著類似屬性的貪婪操作符是 {n,} 。它代表之前的匹配模式重復n次或n次以上,如果沒有加上問號,它會尋找盡可能多的重復次數(shù),加上的話,則會盡可能少重復(當然也就是“重復n次”最少)。
# 建立字串
$str = 'hihihi oops hi' ;
# 使用貪婪的{n,}操作符進行匹配
preg_match( '/(hi){2,}/' , $str , $matches ); # matches[0] 將是 'hihihi'
# 使用墮化了的 {n,}? 操作符匹配
preg_match( '/(hi){2,}?/' , $str , $matches ); # matches[0] 將是 'hihi'
出處:笨活兒
責任編輯:bluehearts
上一頁 下一頁 正則表達式高級技巧及實例詳解 [2]
◎進入論壇網(wǎng)絡編程版塊參加討論
|