相信大家應該都有做過這樣的題目。就是把一個數字轉成每三個數字就用逗号隔開的問題。如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,就這樣吧。