天天看點

RegExp對象的使用與正則替換

相信大家應該都有做過這樣的題目。就是把一個數字轉成每三個數字就用逗号隔開的問題。如100000000,就轉成100,000,000這樣。相信方法有很多種。但是今天介紹一種用正則替換來實作的方法。順便解釋下RegExp對象的作用。

JavaScript RegExp 對象  RegExp 對象用于規定在文本中檢索的内容。RegExp 是javascript中的一個内置對象。為正規表達式。

var regExp =  /[a-z]+/;  這種寫法就相當于下面這種寫法。

 var regExp = new RegExp("[a-z]+");

是以第一種寫法就等于聲明了一個RegExp對象。

RegExp 對象的方法

RegExp 對象有 3 個方法:test()、exec() 以及 compile()。

test()

test() 方法檢索字元串中的指定值。傳回值是 true 或 false。

exec()

exec() 方法檢索字元串中的指定值。傳回值是被找到的值。如果沒有發現比對,則傳回 null。

compile()

compile() 方法用于改變 RegExp。

compile() 既可以改變檢索模式,也可以添加或删除第二個參數。

RegExp.$1是RegExp的一個屬性,指的是與正規表達式比對的第一個 子比對(以括号為标志)字元串,以此類推,RegExp.$2,RegExp.$3,..RegExp.$99總共可以有99個比對

給你看了例子就知道了

var r= /^(\d{4})-(\d{1,2})-(\d{1,2})$/; //正規表達式 比對出生日期(簡單比對)     
r.exec('1985-10-15');
s1=RegExp.$1;
s2=RegExp.$2;
s3=RegExp.$3;
alert(s1+" "+s2+" "+s3)//結果為1985 10 15
           

上面的代碼已經很清晰地說明了。RegExp.$1就代表子比對出來的第一個字元串, 注意,這裡是用()來包住你希望擷取到的值,每組括号就是一個$+數字,順序的話就按左括号的出現順序來排的。是以嵌套的括号就不要問我到底是$幾了。

 是以上面那個問題就很好解決了。

代碼如下

function   formatNum(num)
{   
    if(!/^(\+|-)?(\d+)(\.\d+)?$/.test(num)){alert("wrong!");   return   num;}   //那個正則就相當與new了一個RegExp對象
    var   a   =   RegExp.$1,   b   =   RegExp.$2,   c   =   RegExp.$3;   //第一為是+-号,第二位是整數部分。第三位是小數部分
    var   re   =   new   RegExp().compile("(\\d)(\\d{3})(,|$)");   //這裡的,和$是為了後面作準備的。就是說隻要比對到的前面有一位數字,然後後面還跟着三個數字($是直接比對到最後,而逗号的話是代表在後續循環中已經添加的逗号)
    while(re.test(b))   b   =   b.replace(re,   "$1,$2$3");   //這裡的while循環的意思是一直比對看有沒有滿足條件的,有的話就繼續替換循環下去,直到比對不到這種類型的正規表達式時,停止。提示一下,這裡第一個比對到的就是字元串的最後。是以算下來的話,其實是從後面開始比對的。
    return   a   +""+   b   +""+   c;   //避免變成數字相加。是以中間加入""
}
           

上面的注釋我寫得很清楚了,不知道各位看官有沒有看懂。我再講解講解,

按照上面的邏輯的來轉化數字的過程是這樣的,每次循環後,數字的變化過程如下。

進入方法前如果是100000000,

首先變成100000,000

之後變成100,000,000

最後就直接跳出循環了。輸出資料了。

這樣的話,就比較好了解為什麼上面用 (,|$) 了吧?

RegExp().compile:我想再解釋下這個方法。

其實這個方法就是相當于把之前的RegExp對象的值替換成另外一個正規表達式而已。以下舉個例子

var str = "abc12456def45646ghi";
var regExp = new RegExp("[a-z]+");
document.writeln( regExp.exec(str) ); // abc


// 更改regExp的正規表達式模式,并進行編譯
// 這與下列語句的作用是相同的:regExp = /\d+/;
regExp.compile("\\d+");
document.writeln( regExp.exec(str) ); // 12456
           

上面的例子已經足夠說明問題了。我就不多說了。

我還做了以下的兩個實驗。

var str = "abc12456def45646ghi";
var regExp =/([a-z]+)/;
regExp.test(str);
alert( RegExp.$1 ); 
           

這個輸出什麼?答案是abc

var str = "abc12456def45646ghi";
var regExp =/([a-z]+)/;
regExp.test(str);
var regExp1 = /(\d)/;
regExp1.test(str);
alert( RegExp.$1 ); 
           

這個會輸出什麼?答案是1

這兩個例子就說明了RegExp對象隻能在代碼的運作中,會随時的被後續的正規表達式替換,但是在編碼的時候最好還是使用complie方法來改變RegExp的值。

這裡在講一下replace方法,很多人隻是拿它來替換某些字元串,但是卻很少人使用正規表達式去替換,很多時候正規表達式去替換會減少很多的代碼。

下面是這個方法的介紹。

replace() 方法用于在字元串中用一些字元替換另一些字元,或替換一個與正規表達式比對的子串。

stringObject.replace(regexp,replacement)

regexp 必需。規定了要替換的模式的 RegExp 對象。請注意,如果該值是一個字元串,則将它作為要檢索的直接量文本模式,而不是首先被轉換為 RegExp 對象。 

replacement 必需。一個字元串值。規定了替換文本或生成替換文本的函數。 

replacement 中的 $ 字元具有特定的含義。如下表所示,它說明從模式比對得到的字元串将用于替換。

$1、$2、...、$99 與 regexp 中的第 1 到第 99 個子表達式相比對的文本。 

最後再丢個replace的例子出來,例子比什麼語言描述都會直覺。

例子

在本例中,我們将把 "Doe, John" 轉換為 "John Doe" 的形式:

name = "Doe, John";
name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1");
           

ok,就這樣吧。

繼續閱讀