javascript - 在 JavaScript 正则表达式中命名捕获组?

标签 javascript regex

据我所知,JavaScript 中没有命名捕获组这样的东西。获得类似功能的替代方法是什么?

最佳答案

ECMAScript 2018 引入 named capturing groups进入 JavaScript 正则表达式。

例子:

  const auth = 'Bearer AUTHORIZATION_TOKEN'
  const { groups: { token } } = /Bearer (?<token>[^ $]*)/.exec(auth)
  console.log(token) // "AUTHORIZATION_TOKEN"

如果您需要支持较旧的浏览器,您可以使用普通(编号的)捕获组来完成您可以使用命名捕获组执行的所有操作,您只需要跟踪数字 - 如果捕获的顺序可能会很麻烦在您的正则表达式更改中分组。

我能想到的命名捕获组只有两个“结构”优势:

  1. 在某些正则表达式风格(据我所知,.NET 和 JGSoft)中,您可以对正则表达式中的不同组使用相同的名称(see here for an example where this matters)。但无论如何,大多数正则表达式风格都不支持此功能。

  2. 如果您需要在数字包围的情况下引用编号的捕获组,您可能会遇到问题。假设你想给一个数字加一个零,因此想用 $10 替换 (\d)。在 JavaScript 中,这将起作用(只要您的正则表达式中的捕获组少于 10 个),但 Perl 会认为您正在寻找反向引用编号 10 而不是编号 1,后跟 0。在 Perl 中,您可以在这种情况下使用 ${1}0

除此之外,命名捕获组只是“语法糖”。仅在您真正需要时使用捕获组并在所有其他情况下使用非捕获组 (?:...) 会有所帮助。

JavaScript 更大的问题(在我看来)是它不支持冗长的正则表达式,这会使创建可读、复杂的正则表达式变得容易得多。

Steve Levithan's XRegExp library解决了这些问题。

关于javascript - 在 JavaScript 正则表达式中命名捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5367369/

相关文章:

javascript - 如何从ajax post请求中获取参数

javascript - Angular JS : Why angular-filters errors with Unknown provider: defaultFilterProvider <- defaultFilter?

javascript - ios-deploy 安装失败

java.util.regex.PatternSyntaxException : Unclosed character class near index

javascript - HTML5 多笔画

javascript - 使用 native 文件系统 API 在 Windows 资源管理器中打开文件夹

java - 在groovy中使用正则表达式进行模式匹配

java - 正则表达式忽略两个字符串之间的字符?

javascript - RegExp 关键字转义

javascript - 如何将新行匹配为一个?