Regex的進階技巧8個常用的概念

來源:互聯網
上載者:User

Regex進階技巧背後的關鍵概念

英文原文來自 Smashing Magazine 。由 笨活兒 翻譯。轉載請註明出處。

Regex(Regular Expression, abbr. regex) 功能強大,能夠用於在一大串字元裡找到所需資訊。它利用約定俗成的字元結構運算式來發生作用。不幸的是,簡單的Regex對於一些進階運用,功能遠遠不夠。若要進行篩選的結構比較複雜,你可能就需要用到進階Regex。

本文為您介紹Regex的進階技巧。我們篩選出了八個常用的概念,並配上執行個體解析,每個例子都是滿足某種複雜要求的簡單寫法。如果你對正則的基本概念尚缺乏瞭解,請先閱讀這篇文章,或者這個教程,或者維基條目。
這裡的正則文法適用於PHP,與Perl相容。

1. 貪婪/懶惰

所有能多次限定的正則運算子都是貪婪的。他們儘可能多地匹配目標字串,也就是說匹配結果會儘可能地長。不幸的是,這種做法並不總是我們想要的。因此,我們添加“懶惰”限定符來解決問題。在各個貪婪運算子後添加“?”能讓運算式只匹配儘可能短的長度。另外,修改器“U”也能惰化能多次限定的運算子。理解貪婪與懶惰的區別是運用進階Regex的基礎。

貪婪操作符

操作符 * 匹配之前的運算式零次或零次以上。它是一個貪婪操作符。請看下面的例子:

preg_match( "/<h1>.*< \/h1>/", "</h1><h1>這是一個標題。</h1>
<h1>這是另一個。</h1>", $matches );

句點(.)能代表除分行符號外的任一字元。上面的Regex匹配 h1 標籤以及標籤內的所有內容。它用句點(.)和星號(*)來匹配標籤內的所有內容。匹配結果如下:

<h1>這是一個標題。</h1>
<h1>這是另一個。</h1>

整個字串都被返回。* 操作符會連續匹配所有內容—— 甚至包括中間的 h1 閉合標籤。因為它是貪婪的,匹配整個字串是符合其利益最大化原則。

懶惰操作符

把上面的式子稍作修改,加上一個問號(?),能讓運算式變懶惰:

/<h1>.*?< \/h1>/</h1>

這樣它會覺得,只需匹配到第一個 h1 結尾標籤就完成任務了。
另一個有著類似屬性的貪婪操作符是 {n,} 。它代表之前的匹配模式重複n次或n次以上,如果沒有加上問號,它會尋找儘可能多的重複次數,加上的話,則會儘可能少重複(當然也就是“重複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"



相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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