javascript中的exec()方法,可用于在字符串中查找匹配正則表達(dá)式的值。該方法可返回第一個(gè)匹配項(xiàng)的信息,以數(shù)組形式進(jìn)行返回,包含匹配的值,匹配到的位置及原始字符串。exec()方法是使用RegExp對象調(diào)用的,不能直接使用字符串調(diào)用。
const re = /quick\s(brown).+?(jumps)/ig; const str = 'The Quick Brown Fox Jumps Over The Lazy Dog'; const matches = re.exec(str); console.log(matches[0]); //"Quick Brown Fox Jumps" console.log(matches[1]); //"Brown" console.log(matches[2]); //"Jumps" console.log(matches.index); //4 console.log(matches.input); //"The Quick Brown Fox Jumps Over The Lazy Dog"
在正則表達(dá)式的全局標(biāo)志(g)開啟時(shí),每次執(zhí)行exec()方法將從上一次匹配后的位置繼續(xù)向下進(jìn)行匹配。通過while循環(huán),能夠找到所有匹配項(xiàng)。如果沒有找到匹配項(xiàng),將返回null。
const re = /quick\s(brown).+?(jumps)/ig; const str = 'The Quick Brown Fox Jumps Over The Lazy Dog'; let matches; while(matches = re.exec(str)){ console.log(matches[0]); console.log(matches[1]); console.log(matches[2]); } /* Quick Brown Fox Jumps Brown Jumps */
在上面的例子中,通過while循環(huán),可以輸出所有匹配項(xiàng)的信息。同時(shí),注意到matches不應(yīng)該在循環(huán)條件中聲明,直接賦值即可。聲明matches變量的目的是,將匹配項(xiàng)保存在變量中,方便后續(xù)的操作。
此外,exec()還有其他應(yīng)用場景。當(dāng)正則表達(dá)式中指定捕獲組時(shí),exec()方法會將捕獲的組作為數(shù)組項(xiàng)返回,第一項(xiàng)為全匹配項(xiàng),后續(xù)項(xiàng)為各個(gè)捕獲組的信息。在這種情況下,返回的數(shù)組對象還會有一個(gè)groups屬性,在捕獲組較多時(shí),這個(gè)屬性能夠更好地幫助用戶辨識捕獲組的信息。
const pattern = /(\d{4})-(\d{2})-(\d{2})/; const dateString = '2019-11-05'; const match = pattern.exec(dateString); console.log(match[0]); //"2019-11-05" console.log(match[1]); //"2019" console.log(match[2]); //"11" console.log(match[3]); //"05" console.log(match.groups); //undefined
在上面的例子中,正則表達(dá)式中指定了三個(gè)捕獲組,對應(yīng)日期中的年、月、日。匹配成功后,返回了包含全匹配項(xiàng)及捕獲組的數(shù)組信息。但在這個(gè)例子中,沒有使用JavaScript對捕獲組的支持。當(dāng)與JavaScript的RegExp相結(jié)合時(shí),可獲得更完整的捕獲組信息。
const pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<date>\d{2})/; const dateString = '2019-11-05'; const match = pattern.exec(dateString); console.log(match[0]); //"2019-11-05" console.log(match.groups.year); //"2019" console.log(match.groups.month); //"11" console.log(match.groups.date); //"05"
在上面的例子中,正則表達(dá)式中指定的捕獲組均被命名為year、month、date,匹配成功后,除了返回了數(shù)組信息外,還有包含命名捕獲組的信息。使用命名捕獲組能夠更清晰地辨識數(shù)組中的各項(xiàng),也方便代碼的閱讀及編輯。
總而言之,JavaScript的exec()方法十分強(qiáng)大,基于正則表達(dá)式進(jìn)行字符串匹配時(shí),exec()方法是重要的工具之一。在熟練掌握該方法的使用之后,我們能夠更好地完成各種字符串處理任務(wù)。