什麼是正則表達式
檢索文本時,可以對字符串內容進行模式匹配。RegExp 就是這種模式。用RegExp對象表示正則表達式。
創建正則表達式
- 直接量定義
/pattern/attributes
var regExp = /abc/;
//可以添加修飾符,可以同時使用
/abc/g 全局匹配,查找所有匹配
/abc/i 大小寫不敏感
/abc/m 執行多行匹配
- 構造函數創建對象
new RegExp(pattern, attributes);
var regExp = new RegExp('abc','gi');
var regExp1 = new RegExp(regExp);
//通過new創建的對象和參照對象是兩個不同的對象,可以通過給一個對象增加屬性驗證。
//如果 pattern 是正則表達式,而不是字符串,則必須省略修飾符參數。
var regExp2 = RegExp(regExp);
//不使用new關鍵字,新創建對象和原對象是同一個。
- 區別
var regExp = /\w/g; // \w 中包含下劃線
var regExp1 = new RegExp('\\w','gi'); // 在字符串中會轉義
返回值
如果參數 pattern 是正則表達式而不是字符串,創建一個新的 RegExp 對象,模式與標誌與指定、參照的對象相同。
如果不用 new 運算符,則 RegExp() 作爲函數調用,那麼它的行爲與用 new 運算符調用時一樣,只是當 pattern 是正則表達式時,它只返回 pattern。
RegExp對象的方法
1:RegExp.test() : 檢索字符串中的指定值。返回值是 true 或 false。
var patt1=new RegExp("e");
document.write(patt1.test("The best things in life are free"));
// true
2:RegExp.exec() : 檢索字符串中的指定值。返回值是數組。如果沒有發現匹配,則返回 null。
var patt1=new RegExp("e");
document.write(patt1.exec("The best things in life are free"));
// e
如果需要找到所有某個字符的所有存在,可以使用 “g” 參數,exec() 的工作原理如下:
- 找到第一個 “e”,並存儲其位置 [ lastIndex ]
- 如果再次運行 exec(),則從存儲的位置開始檢索,並找到下一個 “e”,並存儲其位置
var patt1=new RegExp("e","g");
do
{
result=patt1.exec("The best things in life are free");
document.write(result);
}
while (result!=null)
// eeeeeenull 每次循環落下一個結果
var str = "Hello World! Hello W3School!";
var patt1 = /\w+/g;
do {
result = patt1.exec(str);
console.log(result);
} while (result != null)
var str = "Hello World! Hello W3School!";
var patt1 = /\w+?/g;
do {
result = patt1.exec(str);
console.log(result);
} while (result != null)
string.match(regExp) : 返回數組
string.replace():將正則表達式匹配出的字符替換成目標字符
var regExp = /bb/gm;
var str = 'aabbbcc';
str.replace(regExp,'cc');
-----------------------------------------------
var regExp = /(\w{4})(\w{4})/gm; 玩子表達式:反向引用
var str = 'aaaabbbb';
str.replace(regExp,'$2$1'); 替換子表達式位置
str.replace(regExp,function($,$1,$2){
return $2 + $1;
})
-----------------------------------------------
var regExp = /(\w{4})(\w{4})/gm;
var str = 'aaaabbbbd';
str.replace(regExp,function(){
return 'c'
}) //cd
-----------------------------------------------
var regExp = /-(\w)/g;
var str = 'your-first-name';
str.replace(regExp,function($,$1){
return $1.toUpperCase();
})
-----------------------------------------------
str = 'aaaabbbbccccdddd';
var regExp = /((\w{4})(\w{4}))/g; [aaaabbbb,ccccdddd]
var regExp = /^((\w{4})(\w{4}))/g; [aaaabbbb] 以其開頭
-----------------------------------------------
有幾個括號就有幾個子表達式。
regExp = /(?:()())/g; 忽略掉外層表達式
-----------------------------------------------
str = aabb;
regExp = /((\w{2})(\w{2})\1\2)/g;
子表達式1:aabb
2:aa
3:bb
aabb[前面匹配的結果]aabb[\1]aa[\2]
str = 'aaaabbbbccccdddd';
var regExp = /((\w{4})(\w{4}))/g;
regExp.exec(str);
第一位匹配元素,子表達式1,字表達式2
str = '100000000000'
var regExp = /(?=(\d{3})+$)/g;
str.replace(regExp,'.');
- ( . )
- (\w)
單詞字符包括:a-z、A-Z、0-9,以及下劃線。不包含漢字。
- (\W)
- (\s)
空白字符可以是:
空格符 (space character)
製表符 (tab character)
回車符 (carriage return character)
換行符 (new line character)
垂直換行符 (vertical tab character)
換頁符 (form feed character)
- (\b)
通常用於查找位於單詞的開頭或結尾的匹配
匹配的單詞邊界的長度爲零。(不要與 [\b] 混淆。)
/\bm/ 匹配 "moon" 中的 'm';
/oo\b/ 不匹配 "moon" 中的 'oo',因爲 'oo' 後面的 'n' 是一個單詞字符;
/oon\b/ 匹配 "moon" 中的 'oon',因爲 'oon' 位於字符串的末端,後面沒有單詞字符;
/\w\b\w/ 不匹配任何字符,因爲單詞字符之後絕不會同時緊跟着非單詞字符和單詞字符。
- (\B)
通常用於查找不處在單詞的開頭或結尾的匹配
匹配位置的上一個和下一個字符的類型是相同的:即必須同時是單詞,或必須同時是非單詞字符。字符串的開頭和結尾處被視爲非單詞字符。
- (+)
- (*)
可以用於檢索兩個以上,附加作用
- (?)
- ({X})
- ({X,Y})
- ({X,})
- ($)
- (^)
- (?=)
- (?!)
實例
/abc/ 匹配字符串整體
/[abc]/ 匹配滿足範圍裏的任意一個字符
/[^123]/ ^ 在[]纔是非的意思
/[A-Z0-9]/ 匹配滿足範圍裏的任意一個字符
/[A-z][0-9]/ 匹配兩個字符:分別滿足各自範圍要求
/(red|blue|green)/ 匹配其中任何一個
/[\w\W]/ 相當於匹配全部字符,任選其一
/aa/ [aa]
/aa/g [aa,aa,aa]
/(aa)/
/(aa)+/ [aaaa]
/aa+/ [aaaaa]
/a{2,4}/ [aa,aa] 貪心匹配原則
/a{2,4}?/ [aaaa] 非貪心匹配
/a+?/ [a,a,a,a]
/a*?/ [ , , , , ]
/(\w)(\w)\1/ 反向引用,當第一個任意字母匹配後,第三位同步第一位
// 已經匹配成功的字符不會重複匹配
/is(?=all)/ 正向預查
/^a/gm str = 'andfsde\nabiu' [a,a]
/^a/g [a]