正規表示法::不貪多演算

不論在哪種語言,正規表示法(regular Expression,簡稱RE)預設上都會盡可能的擷取更多的資料範圍,一般稱為貪心演算法。當然本篇不是在研究演算法本身,只是作為常用RE的筆記。

但是一般實務上,通常並不需要貪心演算,許多情況下,貪心演算甚至會礙事。所以,當我們在抓取資料的時候,必須要告訴電腦:老實點,別太貪心!這在RE裡面是怎麼表示呢?就是在次數表示符(quantifier)後面,加註一個『?』,例如:

『.』代表抓取任意字元、任意次數、貪心演算
『.
?』代表抓取任意字元、任意次數、不貪心演算
『.+』代表抓取任意字元、一次以上、貪心演算
『.+?』代表抓取任意字元、一次以上、不貪心演算

在quantifier 後面加註問號,並不會改變他的意義,改變的只有他的『貪婪程度』。

其他例子:
d? :任意數字、任意次數、不貪心演算
w
? :任意文字、任意次數、不貪心演算
D? :任意非數字、任意次數、不貪心演算
W
? :任意非文字、任意次數、不貪心演算

其他正規表示式的參考資料

  1. 比對 「一個字元」 的符號:
    […] … 當中任何一個字元
    [^…] 除了 … 之外的任何一個字元
    . 任何一個字元

  2. 「定位」 功能的 anchor:
    ^… 以 … 開頭的字串
    …$ 以 … 結尾的字串
    b 文數字/非文數字 的邊界。

  3. 計數用, 表達 「重複出現多少次」 的 quantifier:
    {5} 重複 5 次

  4. {3,7} 重複 3 到 7 次
    ? 可有可無 (0 次或 1 次)
  5. 重複出現任意次, 包含 0 次
  6. 重複出現任意次, 至少 1 次

常用符號:
d 等同 [0-9],代表『任意數字』
D 等同 [^0-9],代表『任意非數字』
w 等同 [a-zA-Z0-9],代表『任意文字』
W 等同 [^a-zA-Z0-9
],代表『任意非文字』
s 等同 [ tn],代表『任意空白字元』
S 等同 [^ tn],代表『任意非空白字元』

轉錄:
http://deer.nublog.cc/article.php?u=DeeR&i=20080225

CaesarChi

Web developer, focus on website fullstack, special JavaScript, and love sharing developing experience and communicate with developers. http://about.me/clonn