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


Answers

您可以使用XRegExp ,这是一个增强的,可扩展的正则表达式的跨浏览器实现,包括对其他语法,标志和方法的支持:

  • 添加新的正则表达式和替换文本语法,包括对命名捕捉的全面支持。
  • 添加两个新的正则表达式标志: s ,使点匹配所有字符(又名dotall或单行模式)和x ,用于自由间距和注释(又名扩展模式)。
  • 提供一套功能和方法,使复杂的正则表达式处理变得轻而易举。
  • 自动修复正则表达式行为和语法中最常遇到的跨浏览器不一致问题。
  • 让您轻松创建和使用插件,为XRegExp的正则表达式语言添加新的语法和标志。
Question

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




有一个名为named-regexp的node.js库,可以在node.js项目中使用(在浏览器中通过使用browserify或其他打包脚本打包该库)。 但是,该库不能用于包含非命名捕获组的正则表达式。

如果您计算正则表达式中的开始捕获花括号,则可以在正则表达式中创建命名捕获组和编号捕获组之间的映射,并且可以自由混合和匹配。 在使用正则表达式之前,您只需删除组名。 我写了三个函数来证明这一点。 看到这个要点: https://gist.github.com/gbirke/2cc2370135b665eee3efhttps://gist.github.com/gbirke/2cc2370135b665eee3ef




命名捕获组可以很快将其转换为JavaScript。
提案已经在第3阶段。

对于任何标识符名称,可以使用(?...)语法为捕获组指定名称。 日期的正则表达式可以写成/(?\ d {4}) - (?\ d {2}) - (?\ d {2})/ u。 每个名称都应该是唯一的,并遵循ECMAScript IdentifierName的语法。

命名组可以通过正则表达式结果的组属性的属性进行访问。 与非命名组一样,也创建了对组的编号引用。 例如:

let re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
let result = re.exec('2015-01-02');
// result.groups.year === '2015';
// result.groups.month === '01';
// result.groups.day === '02';

// result[0] === '2015-01-02';
// result[1] === '2015';
// result[2] === '01';
// result[3] === '02';



在ES6中,您可以使用数组解构来捕获您的组:

let text = '27 months';
let regex = /(\d+)\s*(days?|months?|years?)/;
let [, count, unit] = text.match(regex) || [];

// count === '27'
// unit === 'months'

注意:

  • 最后一个let的第一个逗号跳过结果数组的第一个值,它是整个匹配的字符串
  • || [] || [] .match()之后的|| []会在没有匹配时阻止解构错误(因为.match()将返回null



Links