如何在正则表达式中表达包含命名组的列表?

时间:2019-04-19 12:32:30

标签: javascript arrays regex typescript

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

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,-,_]+)]+

但是,这不起作用,并在最后一个括号中显示错误:“不匹配的括号”。

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

谢谢!

更新 问题似乎出在[]内部。 仅1条“ C:..”行的有效正则表达式:

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]+

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

1 个答案:

答案 0 :(得分:1)

要在Child组中获得C:John和C:Marie,可以在子组中捕获一个重复组:

(?<Child>(?:C:[A-Za-z0-9,_]+(?:\s|$))+)
  • (?<Child>命名组
  • (?:非捕获组
    • 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,_]+,您可以在其中列出每个字符一次。