在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 ,用于自由间距和注释(又名扩展模式)。
  • 提供一套功能和方法,使复杂的正则表达式处理变得轻而易举。
  • 自动修复正则表达式行为和语法中最常遇到的跨浏览器不一致问题。
  • 让您轻松创建和使用插件,为XRegExp的正则表达式语言添加新的语法和标志。

  • 另一种可能的解决方案:创建一个包含组名和索引的对象。

    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?