正則表達式在JavaScript中,提供了一種內置的構造函數--RegExp.
正則表達式有三種匹配模式:正則表達式
var reg=/bt/gim; ----註釋: /bt/ 兩個斜槓中表示的是匹配項。而 gim表示匹配模式,g i m 三種匹配模式能夠寫一種或幾種,也能夠不寫。
var reg=new RegExp("bt","gim");//---註釋 第一個參數是字符串匹配項,第二種表示匹配模式。
兩種方式在初始化正則表達式的時候所得的結果,幾乎相同。除了一點----- 第二種在出現元字符的時候須要轉義.數組
正則表達式的元字符均須要轉義:函數
( [ { \ ^ $ | ) ? * + .] } 這14中字符在表示的時候均與要轉義,由於他們在正則表達式中均有其本身的含義。spa
關於正則表達式的匹配項的意義,這裏只列舉比較少見的幾種。詳情參見----正則表達式語法 code
/* 第一種演示(X|Y)*/
var str = 'iam007'; var reg = /^([a-z]|\d)/; //匹配以數字或者是字母開頭的字符串 var result = reg.exec(str); console.log(result[1]); //---結果:i
/*第二種 演示(?:X|Y)*/
var str = 'iam007';
var reg = /^(?:[a-z]|\d)/;
var result = reg.exec(str);
console.log(result[1]); //undefinedregexp
var str = 'iam007';
var reg = /(?=[a-z])(\w)/g; var result = reg.exec(str); while (result && result.length) { console.log(result[1]); result = reg.exec(str); } //第一次匹配從i開始,第二次匹配從a開始,第三個匹配從m開始,第四次則無匹配項,輸出結果 :----i a m;
var str = 'iam007';
var reg = /(\w)(?![a-z])\d/g; var result = reg.exec(str); while (result && result.length) { console.log(result[1]); result = reg.exec(str); } // 輸出結果 ---- m 0 第一次匹配(m00),第二次匹配(007).第三次無匹配項。
RegExp的每一個實例都有下列屬性,經過這些屬性能夠獲得正則表達式的各類信息。blog
這些屬性,雖然包含在模式生命中,可是沒有很大的做用,除了lastIndex外(只在global=true時更改纔有效,當global=false時,即便更改,也是從index=0位置處開始搜索),其他的都不可更改,下面咱們舉個例子來講明lastIndex的用處。ip
var reg = /\w/g; var str = 'abcdefg'; var result = reg.exec(str); while (result && result.length) { console.log(result[0]); reg.lastIndex=reg.lastIndex+1; result = reg.exec(str); }//跳躍查詢,實用處也不大。
RegExp構造函數有一些屬性,請同RegExp實例的屬性進行比較,講着兩部分主要是爲了引出下一小節的內容。字符串
長屬性名 | 短屬性名 | 說明 |
input | $_ | 最近一次要匹配的字符串 |
lastMatch | $& | 最近一次匹配項(opera未實現此屬性) |
leftContext | $` | input字符串被匹配項以前的文本 |
multiline | $* | 是否全部表達式都使用多行模式。IE和Opera還沒有實現 |
rightContext | $' | input字符串被匹配項以後的文本 |
lastParen | $+ | 最近一次的捕獲組.Opera未實現 |
補充屬性: $+數字,表示被小括號捕獲的項。get
這些值,能夠從exec()和test()中提取出具體信息。----注:此正則表達式實例必須是字面量形式建立,才能夠訪問。
var text = 'hello world'; var reg = /\s/g; //匹配中間的空格 var result = reg.exec(text); for (var property in RegExp) { console.log('RegExp[' + property + ']=' + RegExp[property]); }
//輸出結果
先來看一段代碼比較:
var text = 'hello2world'; var reg = /\d/g; var result = reg.exec(text); console.log(RegExp.lastMatch);
reg=new RegExp("\\w","g");
result = reg.exec(text);
console.log(RegExp.lastMatch);//輸出結果 2 h
由以上的輸出結果,咱們知道,全部的正則表達式實例在使用的時候都會改變RegExp構造函數的屬性, 因此在每一次正則表達式使用的時候咱們均可以經過RegExp構造函數的屬性,來取得咱們想要的結果。
RegExpObject.exec(string)
參數 | 描述 | 返回值 |
string | 被檢索的字符串 | 字符串數組 |
var text = 'hello2world2sad'; var reg = /\w*(\d)\w/; var result = reg.exec(text); console.log(result[0]);//hello2world2s 貪婪匹配 console.log(result[1]);//2 result = reg.exec(text); console.log(result[0]); // hello2world2s console.log(result[1]);//2 console.log(RegExp.$1) //2
語法:
RegExpObject.test(string)
參數 | 描述 | 返回值 |
string | 被檢索的字符串 | 布爾值 |
var text = 'hello2world'; var reg = /\w*(\d)\w/; var result = reg.test(text); console.log(result); //true result = reg.test(text); console.log(result); //true console.log(RegExp.$1) //2
stringObject.match(searchvalue) stringObject.match(regexp)
語法:
參數 | 描述 | 返回值 |
seachValue | 字符串 | 數組 |
參數 | 描述 | 返回值 |
regexp | 正則表達式 | 數組 |
var text = 'hello2world2sad';
var reg = /\w*(\d)\w/;
var result = text.match(reg);
console.log(result[0]); //hello2world2s
console.log(result[1]); //2
result = text.match(reg);
console.log(result[0]); // hello2world2s
console.log(result[1]); //2
3.1總結:
在非全局模式下:
test()方法: 返回的老是布爾值,每次均從字符串首位開始檢索字符串。
exec()方法: 返回值是數組,數組中保存的老是第一次的匹配結果,每次檢索均是從字符串首位開始檢索。
match()方法:返回值是數組,數組中保存的一次的匹配結果,每次檢索均是從字符串首位開始檢索,返回結果和exec()的結果老是一致的。
在非全局模式下,exec()和match()惟一的區別就是調用者和函數參數位置互換而已。
在全局模式下,每次檢索字符串的時候都是從字符串上一次檢索的結束位置開始檢索,每次返回的數組,第一項是徹底匹配的項,第二項是捕獲項!等於RegExp.$1,同時也改變RegExp構造函數的屬性。
代碼以下:
var text = 'hello1hello2hello3hello4hello5hello';
var reg = /[a-z]*(\d)/g; var result = reg.exec(text); console.log(result); //["hello1", "1"]
result = reg.exec(text); console.log(result); //["hello2", "2"]
因此,能夠利用這種特性用正則表達式,遍歷檢索字符串。
var text = 'hello1hello2hello3hello4hello5hello';
var reg = /[a-z]*(\d)/g; var result = reg.test(text); while (result) { console.log(RegExp.$1); //1 2 3 4 5 result = reg.test(text); }
3.2總結:
在全局模式下:
test()方法: 返回的老是布爾值,每次均是從上一次檢索後的位置開始檢索字符串。
exec()方法: 返回值是數組,數組中保存的是每一次的匹配結果,每次均是從上一次檢索後的位置開始檢索字符串。
match()方法:返回值是數組,數組中保存的是全部的匹配結果,一次檢索後,字符串會被檢測完。下次在檢索的時候,老是從字符串開頭開始檢索,兩次返回的結果老是相同的。
在全局模式下,exec()和test()每次檢索都是從上一次檢索後的位置開始向後檢索。而match()老是將全部匹配的結果保存在數組中。
split()函數的參數能夠是字符串也能夠是正則表達式。返回的結果老是數組
var text = 'hello1hello2hello3hello4hello5hello'; var reg = /\d/g; var result = text.split(reg); console.log(result); //hello ,hello ,hello, hello, hello
replace()函數的參數能夠是字符串也能夠是正則表達式,當其爲正則表達式的時候,使用以下
var reg = /(^\s*|\s*$)/g //去掉字符串的開頭和結尾空格
var hello = ' dasdasd ';
console.log(hello.replace(reg, '').length);
var reg = /(\w)/g //將字符串中小寫換成大寫
var hello = 'dasdasd';
console.log(hello.replace(reg, function () { return RegExp.$1.toUpperCase() })); //DASDASD