正則的test和exec方法與字符串的search,replace,match,split方法的使用
阿新 • • 發佈:2019-04-03
兩種方法 arr 例子 分組 repl 適合 多行 last 結果
一、先介紹一下RegExp對象的五大屬性
- 修飾符屬性
- global-------------------------全局搜索,簡寫g
- ignorecase---------------------忽略字母大小寫,簡寫i
- multiline----------------------多行匹配,簡寫m
- 非修飾符屬性
- lastIndex----------------------一個整數,標示開始下一次匹配的字符位置
- sourse-------------------------正則表達式的原文本
//例子一 console.log(/\d{4}/.global)//false console.log(/\d{4}/g.global)//true console.log(/\d{4}/.ignoreCase)//false console.log(/\d{4}/i.ignoreCase)//true var reg = /\d{4}/g var str='2018ceshi2019' console.log(reg.test('2018ceshi2019'),reg.lastIndex)//true 4 console.log(reg.test('2018ceshi2019'),reg.lastIndex)//true 13 console.log(reg.test('2018ceshi2019'),reg.lastIndex)//false 0 console.log(/\d{4}/.multiline)//false console.log(/\d{4}/m.multiline)//true console.log(/\d{4}/.source)//\d{4}
上面RegExp對象的五大屬性的修飾符屬性在平時都能用到,不常用的是multiline,我們下面看看multiline屬性的使用場景
- 如果目標字符串中不含有換行符\n,即只有一行,那麽/m修飾符沒有任何意義。
- 如果正則表達式中不含有^或$匹配字符串的開頭或結尾,那麽/m修飾符沒有任何意義。
var mutiline = /^abc/m; var singleline = /^abc/; var target = "ef\r\nabcd"; console.log(mutiline.test(target));//true console.log(singleline.test(target));//false
二、RegExp對象定義了兩個用於模式匹配的方法,它們是exec()和test()
1、test()
- 如果不使用循環,全局匹配和非全局匹配結果是一樣的
- 用法:regexp.test(string)
- 作用:對一個指定的字符串執行一個正則表達式匹配
- 返回值:true或false
//例子二 var reg = /\d{4}/g console.log(reg.test('2018ceshi2019'),reg.lastIndex)//true 4 console.log(reg.test('2018ceshi2019'),reg.lastIndex)//true 13 console.log(reg.test('2018ceshi2019'),reg.lastIndex)//false 0 console.log(reg.test('2018ceshi2019'),reg.lastIndex)//true 4 console.log(reg.test('2018ceshi2019'),reg.lastIndex)//true 13 console.log(reg.test('2018ceshi2019'),reg.lastIndex)//false 0
2、exec()
- exec()和match()方法很類似
- 如果不使用循環,全局匹配和非全局匹配結果是一樣的
- 用法:regexp.exec(string)
- 作用:對一個指定的字符串執行一個正則表達式匹配
- 返回值:數組或null,數組分為兩種情況,有分組(括號裏匹配)和無分組
- 若無分組則數組裏的內容包含三項,分別是
- 匹配的內容
- 匹配內容的起始索引
- 原字符串
- 若有分組則數組裏的內容包含多項,分別是
- 第一項是匹配的內容
- 第二項開始是分組(括號裏匹配)的內容,有幾個分組就有幾項
- 倒數第二項是匹配內容的起始索引
- 倒數第一項是原字符串
- 若無分組則數組裏的內容包含三項,分別是
//例子三
var str = "2018ceshi2019"
//使用非全局匹配
console.log(/\d\w/.exec(str));//["20", index: 0, input: "2018ceshi2019"]
console.log(/([a-z])(\w)/.exec(str));//["ce", "c", "e", index: 4, input: "2018ceshi2019"]
//使用全局匹配
var regg=/\d\w/g
console.log(regg.exec(str));//["20", index: 0, input: "2018ceshi2019"]
console.log(regg.exec(str));//["18", index: 2, input: "2018ceshi2019"]
console.log(regg.exec(str));//["20", index: 9, input: "2018ceshi2019"]
console.log(regg.exec(str));//["19", index: 11, input: "2018ceshi2019"]
console.log(regg.exec(str));//null
console.log(regg.exec(str));//["20", index: 0, input: "2018ceshi2019"]
var regg2=/([a-z])(\w)/g
console.log(regg2.exec(str));//["ce", "c", "e", index: 4, input: "2018ceshi2019"]
從上面的例子可以發現正則的exec()和test()方法如果不使用循環,全局匹配和非全局匹配結果是一樣的
exec適合用於循環匹配,雖然全局匹配和非全局的返回值一樣,但使用exec循環時,必須要加修飾符g
//例子四
var str='abc,bbc,cbc,dbc';
var reg=/(\w)bc/g;
//循環匹配時,要先將正則表達式定義好,不然每次都是一個新的正則對象,影響lastIndex的變化
//一定要加修飾符g,lastIndex是匹配項後面的下標,是下一次匹配的開始下標
//當 exec() 再也找不到匹配的文本時,它將返回 null,並把 lastIndex 屬性重置為 0
//exec()方法使用循環
var resultArr=[];
while(result=reg.exec(str)){
console.log("lastIndex: "+reg.lastIndex);
//lastIndex: 3
//lastIndex: 7
//lastIndex: 11
//lastIndex: 15
resultArr.push(result);
}
console.log(JSON.stringify(resultArr));//[["abc","a"],["bbc","b"],["cbc","c"],["dbc","d"]]
//test()方法使用循環
resultArr=[]
while(result=reg.test(str)){
console.log("lastIndex: "+reg.lastIndex);
//lastIndex: 3
//lastIndex: 7
//lastIndex: 11
//lastIndex: 15
resultArr.push(result);
}
console.log(JSON.stringify(resultArr));//[true,true,true,true]
三、String對象支持四種利用正則表達式的方法,分別為search(),replace(),match(),split()
1、search()
- 是否使用全局匹配,返回的結果都是一樣的
- 用法:string.search(regexp)
- 作用:返回第一個與之相配的字符串開始的位置
- 返回值:如果能查找到返回第一個匹配的字符的位置,如果沒有匹配到,但是-1
//例子五
var str = "jfkdasjf"
var reg=/a/g
console.log(str.search(reg));//4
console.log(str.search(/z/));//-1
2、replace()
- 用法:string.replace(regexp,str)
- 作用:在string中找到regexp匹配的字符串,替換成str
- 返回值:沒有匹配到就返回原字符串,匹配到了就返回原字符串被替換後的字符串
//例子六
var str = "jfkdasjf"
var reg = /a/g;
console.log(str.replace(reg,"被替換了"))
3、match()
- 用法:string.match(regexp)
- 作用:在string中找到regexp匹配的字符串
- 返回值:數組或null
- 如果匹配正則表達式,則返回一個數組;
- 如果使用的非全局匹配,返回的結果是個數組,數組的成員是和正則的exec()方法類似
- 如果是使用的全局匹配,返回的結果是個數組,數組的成員是,匹配到的字符串
- 如果不匹配則返回null
- 如果匹配正則表達式,則返回一個數組;
//例子七
var str = "1a2b3c";
//1使用的是非全局匹配,匹配到的是結果是數組,數組成員是[匹配到的字符,匹配到的字符的index,被匹配的字符串]
var reg = /[\d.]/;
console.log(str.match(reg)); //["1",groups:undefined,index:0,input:"1a2b3c"]
console.log(JSON.stringify(str.match(reg))); //'["1"]'
//2使用的是全局匹配,匹配到的結果是數組,數組的成員是[匹配到的字符串,...]
var reg2 = /\d./g;
console.log(str.match(reg2)); //["1a","2b","3c"]
console.log(JSON.stringify(str.match(reg2))); //'["1a","2b","3c"]'
//3如果使用的是全局匹配,且匹配到的結果只有一個,返回的也是和上面的2一樣的
console.log('1asdf'.match(reg2)); //["1a"]
console.log(JSON.stringify('ab2c'..match(reg2))); //'["1a"]'
4、split()
- 用法:string.split(regexp)
- 作用:在string中找到regexp匹配的字符串,將字符串分割成數組
- 返回值:數組
//例子八
var str = "[email protected]#is&zhou&zhou"
//能匹配到
console.log(str.split(/@|#|&/g))//["my", "name", "is", "zhou", "zhou"]
//不能匹配到
console.log(str.split(/~/g))//["[email protected]#is&zhou&zhou"]
四、通過上面的例子,我們發現正則的exec()和match()方法很類似,我們下面列舉下這兩種方法的區別
- 返回的結果
- 共同點
- 返回值是數組或null
- 如果匹配正則表達式,則返回一個數組;
- 如果不匹配則返回null
- 不同點(前提是匹配了正則表達式,有返回值)
- exec()方法
- 返回的數組分為兩種情況,有分組(括號裏匹配)和無分組
- 若無分組則數組裏的內容包含三項,分別是
匹配的內容
匹配內容的起始索引
原字符串 - 若有分組則數組裏的內容包含多項,分別是
第一項是匹配的內容
第二項開始是分組(括號裏匹配)的內容,有幾個分組就有幾項
倒數第二項是匹配內容的起始索引
倒數第一項是原字符串
- 若無分組則數組裏的內容包含三項,分別是
- 返回的數組分為兩種情況,有分組(括號裏匹配)和無分組
- match()方法
- 返回的數組不管是有分組(括號裏匹配)還是無分組,返回的數組裏面的元素的結構是一樣的
- 全局匹配和非全局匹配的數組結構不一樣
- 全局匹配的數組結構(["匹配的內容","匹配的內容"...])
- 非全局匹配的數組結構(與exec方法不使用分組返回的數組結構一樣)
- 匹配的內容
- 匹配內容的起始索引
- 原字符串
- exec()方法
- 共同點
- 使用全局匹配和非全局匹配
exec()方法使用全局匹配(不使用循環)和非全局匹配返回的結果是一樣的
match()方法使用全局匹配和非全局匹配,如果能匹配到,返回的數組元素的結構是不一樣的,區別在上一個點裏面有列舉
正則的test和exec方法與字符串的search,replace,match,split方法的使用