据我所知,JavaScript 中没有命名捕获组这样的东西。获得类似功能的替代方法是什么?
最佳答案
ECMAScript 2018 引入 named capturing groups进入 JavaScript 正则表达式。
例子:
const auth = 'Bearer AUTHORIZATION_TOKEN'
const { groups: { token } } = /Bearer (?<token>[^ $]*)/.exec(auth)
console.log(token) // "AUTHORIZATION_TOKEN"
如果您需要支持较旧的浏览器,您可以使用普通(编号的)捕获组来完成您可以使用命名捕获组执行的所有操作,您只需要跟踪数字 - 如果捕获的顺序可能会很麻烦在您的正则表达式更改中分组。
我能想到的命名捕获组只有两个“结构”优势:
在某些正则表达式风格(据我所知,.NET 和 JGSoft)中,您可以对正则表达式中的不同组使用相同的名称(see here for an example where this matters)。但无论如何,大多数正则表达式风格都不支持此功能。
如果您需要在数字包围的情况下引用编号的捕获组,您可能会遇到问题。假设你想给一个数字加一个零,因此想用
$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/