可以使用 exec() 方法访问 JavaScript 中正则表达式捕获的子组。此方法返回一个类似数组的对象,其中包含表达式所做的匹配。
为了说明这一点,请考虑以下示例:
var myString = "something format_abc"; // Obtain "abc" const arr = /(?:^|\s)format_(.*?)(?:\s|$)/.exec(myString); console.log(arr); // Outputs: [" format_abc", "abc"] console.log(arr[1]); // Outputs: undefined (the issue) console.log(arr[0]); // Outputs: format_undefined (another issue)
预期输出是获取子组“abc”作为 arr 数组的第二个元素。然而,访问 arr[1] 和 arr[0] 分别会导致未定义和不正确的值。
解决未定义的输出:
缺少值arr[1] 是由于 .*?正则表达式中使用的非贪婪量词。此量词捕获尽可能少的字符数,从而生成不带分隔符的字符串“format_abc”。
要解决此问题,请使用贪婪量词 .* 代替:
/(?:^|\s)format_(.*)(?:\s|$)/
纠正不正确的字符串输出:
出现 arr[0] 问题来自使用控制台的类似 printf 的格式。 format_%A 中的特殊字符 % 尝试替换下一个丢失的参数的值。
要解决此问题,请转义正则表达式中的 %:
/(?:^|\s)format_(.*?)(?:\s|$)/
使用通过这些修改,可以实现正确的输出:
[" format_abc", "abc"] console.log(arr[1]); // Outputs: "abc" console.log(arr[0]); // Outputs: " format_abc"
通过 matchAll() 访问匹配组(ECMAScript 2020 及更高版本):
String.prototype.matchAll() 方法提供了一种现代且更直观的方法来迭代字符串中的多个匹配项。它返回一个迭代器,可以按如下方式使用:
const string = "something format_abc"; const regexp = /(?:^|\s)format_(.*?)(?:\s|$)/g; const matches = string.matchAll(regexp); for (const match of matches) { console.log(match); console.log(match.index); }
以上是如何正确访问 JavaScript 正则表达式中的匹配组?的详细内容。更多信息请关注PHP中文网其他相关文章!