【问题标题】:How can I express a list containing named groups in regex?如何在正则表达式中表达包含命名组的列表?
【发布时间】:2019-04-19 12:32:29
【问题描述】:

我目前有以下正则表达式:

P:(?<ParentName>[A-Z,a-z,0-9,-,_]+)-(?<ParentAge>[A-Z,a-z,0-9,-,_]+)
C:(?<Child>[A-Z,a-z,0-9,-,_]+)

匹配
P:Bob-30
C:Jane

但是,我希望能够表达一个匹配的正则表达式:

P:Jack-35
C:John
C:Marie

我通过在第二部分周围添加 []+ 来尝试这个:

P:(?<ParentName>[A-Z,a-z,0-9,-,_]+)-(?<ParentAge>[A-Z,a-z,0-9,-,_]+)
[C:(?<Child>[A-Z,a-z,0-9,-,_]+)]+

但是这不起作用并给出错误:'unmatched parenthesis )'for the last parentheses。

有人知道我该如何表达吗?

谢谢!

更新 问题似乎是[]里面的[]。 工作正则表达式只有 1 "C:.."-line:

P:(?<ParentName>[A-Za-z0-9-_]+)-(?<ParentAge>[A-Za-z0-9-_]+)
C:[A-Za-z0-9-_]+\n

对于多个“C:..”-行,正则表达式不起作用:

P:(?<ParentName>[A-Za-z0-9-_]+)-(?<ParentAge>[A-Za-z0-9-_]+)
[C:[A-Za-z0-9-_]+\n]+

第二行的第一个[与第一个]匹配,而应该是第二个]。

【问题讨论】:

  • JavaScript 不支持命名组。
  • @Pointy ECMAScript 2018 兼容 JS 正则表达式。
  • @WiktorStribiżew 是的,我记得 :) Here 但是它没有得到广泛支持
  • 谢谢!但命名组工作;)。只有在尝试在列表中表达它们时才会出现问题
  • [ ] 子表达式中的那些逗号对我来说似乎很奇怪;您不需要逗号来分隔字符范围,并且逗号将被视为允许的字符集的一部分。

标签: javascript arrays regex typescript


【解决方案1】:

要在Child 组中获取 C:John 和 C:Marie,您可以在子组中捕获重复组:

(?<Child>(?:C:[A-Za-z0-9,_]+(?:\s|$))+)
  • (?&lt;Child&gt;命名组
  • (?:非捕获组
    • C:[A-Za-z0-9,_]+(?:\s|$) 匹配 C: 后跟字符类中列出的任何字符,然后匹配空白字符或字符串结尾
  • )+关闭捕获组并重复1次以上
  • )关闭命名组

您的模式可能如下所示:

P:(?<ParentName>[A-Za-z0-9,_]+)-(?<ParentAge>[A-Za-z0-9,_]+)\s*(?<Child>(?:C:[A-Za-z0-9,_]+(?:\s|$))+)

Regex demo

请注意,character class 可以更新为 [A-Za-z0-9,_]+,您可以在其中列出每个字符一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2010-09-29
    • 2018-01-29
    相关资源
    最近更新 更多