在JavaScript正则表达式中命名捕获组?据我所知,在JavaScript中没有名为捕获组的东西。获得类似功能的另一种方法是什么?
3 回答
qq_笑_17
TA贡献1818条经验 获得超7个赞
ECMAScript 2018将命名捕获组引入JavaScript正则表达式。
如果您需要支持旧浏览器,您可以使用正常(编号)捕获组执行所有操作,您可以使用命名捕获组执行操作,您只需要跟踪数字 - 如果您的捕获组的顺序可能很麻烦正则表达式的变化。
我能想到的命名捕获组只有两个“结构”优势:
在一些正则表达式中(.NET和JGSoft,据我所知),您可以在正则表达式中为不同的组使用相同的名称(有关这一事项的示例,请参阅此处)。但是大多数正则表达式都不支持这种功能。
如果您需要在数字包围的情况下引用编号的捕获组,则可能会出现问题。假设您想要为数字添加零,因此要替换
(\d)
为$10
。在JavaScript中,这将起作用(只要你的正则表达式中有少于10个捕获组),但Perl会认为你正在寻找反向引号10
而不是数字1
,然后是a0
。在Perl中,您可以${1}0
在这种情况下使用。
除此之外,命名捕获组只是“语法糖”。仅在您真正需要时才使用捕获组,并(?:...)
在所有其他情况下使用非捕获组。
使用JavaScript的更大问题(在我看来)是它不支持详细的正则表达式,这将使可读,复杂的正则表达式的创建更容易。
Steve Levithan的XRegExp库解决了这些问题。
慕运维8079593
TA贡献1876条经验 获得超5个赞
另一种可能的解决方案:创建一个包含组名和索引的对象。
var regex = new RegExp("(.*) (.*)");var regexGroups = { FirstName: 1, LastName: 2 };
然后,使用对象键来引用组:
var m = regex.exec("John Smith");var f = m[regexGroups.FirstName];
这使用正则表达式的结果提高了代码的可读性/质量,但不提高了正则表达式本身的可读性。
添加回答
举报
0/150
提交
取消