標籤:
Regex的聲明
直接寫在/與/之間
var reg = /...../;
使用RegExp()建構函式
var reg = new RegExp(......);
在ECMAscript 3中RegExp對象類似於引用對象,在ECMAscript 5中RegExp對象類似於值對象。
var reg= /a/;var reg2 =/a/;console.log(reg === reg2);//ES3標準返回true,ES5返回false//此時在ES3中reg與reg2指向同一個對象//在ES5中reg與reg2為兩個不同的對象
逸出字元
Regex所有字元都按直面量進行匹配。加入反斜線(\)可進行轉義。
預定義類
. [^\n\r] 除了換行和斷行符號之外的任一字元
\d [0-9] 數字字元digit
\D [^0-9] 非數字字元
\w [a-zA-Z0-9_] 單詞字元(所有的字母數字和_ ) word
\W [^a-zA-Z0-9_] 非單詞字元
\s [\f\r\n\t\v] 不可見字元 space
\S [^\f\r\n\t\v] 可見字元
量詞
"*" 重複零次或更多 x>=0
"+" 重複一次或更多次 x>=1
"?" 重複零次或一次 x=(0||1)
{n} n次 x=n
{n,} 重複n次或更多 x>=n
{n,m} 重複出現的次數比n多但比m少 n<=x<=m
非貪婪匹配
當以上字元後再加入一個?時將進行非貪婪匹配如*?,??,+?.{n,m}?。
進行貪婪匹配時將儘可能少的匹配內容
如/a+/匹配aaa時將回匹配全部a即匹配“aaa”,而/a+?/匹配aaa時將匹配一個“a”。
需要注意的是非貪婪匹配從第一個匹配到的值開始。
例如使用/a+?b/匹配aaab時並不會按最少的匹配ab。而是匹配aaab。這是因為匹配是從第一個a開始匹配所以也會把之前的a都匹配到。
選擇
“|”分割用於選擇的字元
a|b|c可匹配a或者b或者c
分組
“( )”可用於分組調用exec方法返回Array對象,0位置為匹配到的完整內容,之後位置為”( )”所分組的資料。
var str = "abcdefg";var r = /c(d(e))/;console.log(r.exec(str)); //["cde", "de", "e", index: 2, input: "abcdefg"]
在“(”後跟“?:”表示不擷取
var str = "abcdefg";var r = /c(?:d(e))/;console.log(r.exec(str)); // ["cde", "e", index: 2, input: "abcdefg"] 不擷取de
元字元[ ]
匹配一個出現在 [] 中的字元。
var str1 = "abcde";var str2 = "fghig";var r = /[bg]/;console.log(r.exec(str1)[0]); //bconsole.log(r.exec(str2)[0]); //g
使用 [] 匹配多個字元:[a-z] [A-Z]
表示否定意思:[^abc] 不匹配^之後的字元
元字元^和$
^ 表示必須以某某開頭
$ 表示必須以某某結尾
var r1 = /^a/;var r2 = /a$/;str1 = "ab";str2 = "ba";console.log(r1.test(str1)); //trueconsole.log(r1.test(str2)); //falseconsole.log(r2.test(str1)); //falseconsole.log(r2.test(str2)); //true
當同時出現^和$時表示精確匹配
var r1 = /^asd$/;str1 = "asd";str2 = "a-s-d";console.log(r1.test(str1)); //trueconsole.log(r1.test(str2)); //false
正則替換與組引用
replace方法第一個參數可以用Regex來表示需要被替換的內容。
var r1 = /^asd$/;str1 = "LandMine LLLLLL";str1 = str1.replace(/L/g,"l"); //g表示全域匹配console.log(str1); //landMine llllll
第二個參數出現$後跟數字表示正則組引用
var s = ‘1991-1-2‘;s = s.replace( /(\d+)-(\d+)-(\d+)/g, "$1年$2月$3日" );console.log(s); //1991年1月2日
javascript之Regex學習筆記