在JavaScript正则表达式中命名捕获组?
据我所知,在JavaScript中没有命名捕获组这样的事情。 什么是获得类似功能的替代方法?
ECMAScript 2018向JavaScript正则表达式引入了命名捕获组。
如果您需要支持旧浏览器,您可以使用正常(编号)的捕获组完成所有可以使用命名捕获组的操作,只需要跟踪数字 - 如果在您的捕获组中捕获组的顺序可能会很麻烦正则表达式的变化。
我能想到的命名捕捉组只有两个“结构”优势:
在一些正则表达式(.NET和JGSoft,据我所知)中,你可以在你的正则表达式中为不同的组使用相同的名字(这里请看这里的一个例子)。 但大多数正则表达式并不支持这个功能。
如果您需要在被数字包围的情况下引用编号的捕获组,则可能会出现问题。 假设你想为一个数字添加一个零,因此想用$10
替换(d)
。 在JavaScript中,这将起作用(只要你的正则表达式中捕获组少于10个),但Perl会认为你正在寻找反向引用号码10
而不是数字1
,然后是0
。 在Perl中,您可以在这种情况下使用${1}0
。
除此之外,命名捕捉组只是“语法糖”。 它有助于仅在真正需要它们时使用捕获组,并且在所有其他情况下使用非捕获组(?:...)
。
JavaScript中更大的问题(在我看来)是,它不支持冗长的正则表达式,这将使创建可读的复杂正则表达式变得更容易。
Steve Levithan的XRegExp库解决了这些问题。
您可以使用XRegExp,这是一个增强的,可扩展的正则表达式的跨浏览器实现,包括对其他语法,标志和方法的支持:
s
,使点匹配所有字符(又名dotall或单行模式)和x
,用于自由间距和注释(又名扩展模式)。 另一种可能的解决方案:创建一个包含组名和索引的对象。
var regex = new RegExp("(.*) (.*)");
var regexGroups = { FirstName: 1, LastName: 2 };
然后,使用对象键来引用组:
var m = regex.exec("John Smith");
var f = m[regexGroups.FirstName];
这改善了代码的可读性/质量,使用正则表达式的结果,而不是正则表达式本身的可读性。
链接地址: http://www.djcxy.com/p/74807.html上一篇: Named capturing groups in JavaScript regex?
下一篇: How do I access named capturing groups in a .NET Regex?