js筆記四十七之正則表達(dá)式(3)

正則的捕獲 exec

  • 捕獲的內(nèi)容格式

每一次捕獲的時(shí)候都是先進(jìn)行默認(rèn)的匹配,如果沒有匹配成功的,捕獲到額結(jié)果是null;只有有匹配的內(nèi)容才能捕獲到

  1. 捕獲到的內(nèi)容是一個(gè)數(shù)組
    數(shù)組中的第一項(xiàng)是但錢大正則捕獲的內(nèi)容
    index : 捕獲內(nèi)容在字符串中開始的索引位置
    input : 捕獲的原始字符串
  2. 正則捕獲的特點(diǎn)
    懶惰性: 每一次執(zhí)行exec值捕獲第一個(gè)匹配的內(nèi)容, 在不進(jìn)行任何處理的情況下, 再執(zhí)行多次捕獲, 捕獲的還是第一個(gè)匹配的內(nèi)容
    貪婪性: 正則的每一次捕獲都是按照匹配最長的結(jié)果捕獲的,例如: 2符合正則/2015頁符合正則,我們默認(rèn)捕獲的是2015
var reg = /\d+/;
var str = "lilei18hanmeimei16";

console.log(reg.lastIndex) // -> 0
console.log(reg.exec(str)); // -> ["18", index: 5, input: "lilei18hanmeimei16", groups: undefined]

console.log(reg.lastIndex) // -> 0
console.log(reg.exec(str)); // -> ["18", index: 5, input: "lilei18hanmeimei16", groups: undefined]
如何解決正則的懶惰性?

在正則的末尾加上一個(gè)修飾符"g" ;

修飾符 : g:全局匹配, i : 不區(qū)分大小寫 m : 多行匹配

原理: 加了全局修飾符 g, 正則每一次捕獲結(jié)束后,我們的lastIndex的值都變?yōu)榱俗钚碌闹?下一次捕獲從最新的位置開始查找,這樣就可以把所有需要捕獲的內(nèi)容都獲取到了

var reg = /\d+/g;
var str = "lilei18hanmeimei16";

console.log(reg.lastIndex) // -> 0
console.log(reg.exec(str)); // -> ["18", index: 5, input: "lilei18hanmeimei16", groups: undefined]

console.log(reg.lastIndex) // -> 7
console.log(reg.exec(str)); // -> ["16", index: 16, input: "lilei18hanmeimei16", groups: undefined]

console.log(reg.lastIndex) // -> 18
console.log(reg.exec(str)); // -> null

一次性匹配所有符合條件的內(nèi)容(加 g 全局匹配)

var reg = /\d+/g;
var str = "lilei18hanmeimei16lihua17";
var ary = [];
var res = reg.exec(str);
while(res){
    ary.push(res[0]);
    res = reg.exec(str);
}
console.log(ary); // -> ["18", "16", "17"]
如何解決正則的貪婪性?

在量詞元字符后面添加一個(gè) ? 即可

var reg = /\d+?/g;
var str = "lilei18hanmeimei16lihua17";
console.log(reg.exec(str)); // -> 2
? 在正則中有很多的作用:
  1. 放在普通的額元字符后面代表出現(xiàn)0-1次 /\d?/
  2. 放在一個(gè)量詞的元字符后面代表取消捕獲時(shí)候的貪婪性
var reg = /\d+?/g;
var str = "lilei18hanmeimei16lihua17";
var ary = [];
var res = reg.exec(str);
while(res){
    ary.push(res[0]);
    res = reg.exec(str);
}
console.log(ary); // -> ["1", "8", "1", "6", "1", "7"]

字符串中的match方法 -> 把所有和正則匹配的字符串都獲取到

var reg = /\d+?/g;
var str = "lilei18hanmeimei16lihua17";
var ary = str.match(reg);
console.log(ary) // -> ["1", "8", "1", "6", "1", "7"]

雖然在當(dāng)前的情況下match比我們的exec更加的簡便一些,但是match中存在一些自己處理不了的問題: 在分組捕獲的情況下,match只能捕獲到大正則匹配的內(nèi)容,而對于小正則捕獲的內(nèi)容是無法獲取的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容