跳到主要內容

發表文章

目前顯示的是有「reg」標籤的文章

[分享] javascript RegExp.$1 正規表示法理論與範例

javascript 裡面正規表示法其實蠻多元的,參考 ECMAScript 15.5.2 當中提到, ""When String is called as part of a new expression, it is a constructor: it initialises the newly created object. 原文網址 意謂著當String 出現的時候,同時也會產生RegExp 這個物件,表示String 也同時帶有RegExp 屬性。因此可以瞭解為何javascript String 可以match, exec, replace 等function 當中使用正規表示法。 RegExp 如同前面提到是一個javascript object.該如何建構? var reg = new RegExp(/text/, "gims"); var reg = /text/gims; 兩者的宣告方式是相同的,如此就宣告一個完整的正規表示法物件。實際應用幾乎使用第二種宣告方式,今天要討論的就是RegExp.$ 這個變數到底是怎麼產生。 在這邊就不討論深入正規表示法內部使用規則及原理,回到本文重點,實際上看一下在javascript 正規表示法的另外一種用法RegExp.$1.....$xx 當我們使用正規表示法時,使用分群就會可以將不同分群,視為不同的變數,就可以直接使用RexExp.$1,RexExp.$2...以此類推。 一個很爛的舉例來說, var str = "abcdefghij"; var reg = new RegExp(/(\w)(\w)(\w)(\w)(\w)(\w)(\w)(\w)/); for (var i=1; i< 99; i++) { console.log(RegExp["$" + i]); } 會看到結果為, live demo 實例上活用起來也蠻有趣的,例如 var str = "tel:(02)2888-8888"; var reg = new RegExp(/^tel:[(](\d\d)[)]+(\d+)-(\d+)/); str.match(reg);...

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

不論在哪種語言,正規表示法(regular Expression,簡稱RE)預設上都會盡可能的擷取更多的資料範圍,一般稱為貪心演算法。當然本篇不是在研究演算法本身,只是作為常用RE的筆記。 但是一般實務上,通常並不需要貪心演算,許多情況下,貪心演算甚至會礙事。所以,當我們在抓取資料的時候,必須要告訴電腦:老實點,別太貪心!這在RE裡面是怎麼表示呢?就是在次數表示符(quantifier)後面,加註一個『?』,例如: 『.*』代表抓取任意字元、任意次數、貪心演算 『.*?』代表抓取任意字元、任意次數、不貪心演算 『.+』代表抓取任意字元、一次以上、貪心演算 『.+?』代表抓取任意字元、一次以上、不貪心演算 在quantifier 後面加註問號,並不會改變他的意義,改變的只有他的『貪婪程度』。 其他例子: \d*? :任意數字、任意次數、不貪心演算 \w*? :任意文字、任意次數、不貪心演算 \D*? :任意非數字、任意次數、不貪心演算 \W*? :任意非文字、任意次數、不貪心演算 其他正規表示式的參考資料 1. 比對 「一個字元」 的符號: [...] ... 當中任何一個字元 [^...] 除了 ... 之外的任何一個字元 . 任何一個字元 2. 「定位」 功能的 anchor: ^... 以 ... 開頭的字串 ...$ 以 ... 結尾的字串 \b 文數字/非文數字 的邊界。 3. 計數用, 表達 「重複出現多少次」 的 quantifier: {5} 重複 5 次 * {3,7} 重複 3 到 7 次 ? 可有可無 (0 次或 1 次) * 重複出現任意次, 包含 0 次 + 重複出現任意次, 至少 1 次 常用符號: \d 等同 [0-9],代表『任意數字』 \D 等同 [^0-9],代表『任意非數字』 \w 等同 [a-zA-Z0-9_],代表『任意文字』 \W 等同 [^a-zA-Z0-9_],代表『任意非文字』 \s 等同 [ \t\n],代表『任意空白字元』 \S 等同 [^ \t\n],代表『任意非空白字元』 轉錄: http://deer.nublog.cc/article.php?u=DeeR&i=20080225