2011年12月20日 星期二

[分享] 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);
console.log("tel number is : " + str);
console.log("tel country number is : " + RegExp.$1);
console.log("tel front 4 number are : " + RegExp.$2);
console.log("tel last 4 nuber are : " + RegExp.$3);


結果如下

live demo

結語
RegExp 這個物件之前有稍微接觸過,不過並不是十分瞭解,這次因為工作的關係又有機會碰到,實際找了一下ECMA-262之後,對於這個物件為何會產生也稍微有點瞭解。

正規表示法實際上在javascript 的使用上十分廣泛,不只是String 的過濾,例如其他DOM選取,js-template 正規表示法都是增加實做速度的實際應用。

相關連結
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
http://www.regular-expressions.info/javascript.html
http://blog.roodo.com/rocksaying/archives/2670695.html

沒有留言:

張貼留言

Facebook