javascript中的exec()方法,可用于在字符串中查找匹配正则表达式的值。该方法可返回第一个匹配项的信息,以数组形式进行返回,包含匹配的值,匹配到的位置及原始字符串。exec()方法是使用RegExp对象调用的,不能直接使用字符串调用。
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"
在正则表达式的全局标志(g)开启时,每次执行exec()方法将从上一次匹配后的位置继续向下进行匹配。通过while循环,能够找到所有匹配项。如果没有找到匹配项,将返回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循环,可以输出所有匹配项的信息。同时,注意到matches不应该在循环条件中声明,直接赋值即可。声明matches变量的目的是,将匹配项保存在变量中,方便后续的操作。
此外,exec()还有其他应用场景。当正则表达式中指定捕获组时,exec()方法会将捕获的组作为数组项返回,第一项为全匹配项,后续项为各个捕获组的信息。在这种情况下,返回的数组对象还会有一个groups属性,在捕获组较多时,这个属性能够更好地帮助用户辨识捕获组的信息。
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
在上面的例子中,正则表达式中指定了三个捕获组,对应日期中的年、月、日。匹配成功后,返回了包含全匹配项及捕获组的数组信息。但在这个例子中,没有使用JavaScript对捕获组的支持。当与JavaScript的RegExp相结合时,可获得更完整的捕获组信息。
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"
在上面的例子中,正则表达式中指定的捕获组均被命名为year、month、date,匹配成功后,除了返回了数组信息外,还有包含命名捕获组的信息。使用命名捕获组能够更清晰地辨识数组中的各项,也方便代码的阅读及编辑。
总而言之,JavaScript的exec()方法十分强大,基于正则表达式进行字符串匹配时,exec()方法是重要的工具之一。在熟练掌握该方法的使用之后,我们能够更好地完成各种字符串处理任务。