正则表达式创建两个捕获组,其中第二个捕获多次

Regex to create two capture groups, where the second captures multiple times

我的测试字符串是

thread_id=1152236, geo_locality.nomv="Seattle|||San Francisco|||Chicago", user_reference_count=0

是否可以让一个正则表达式有两个个捕获组,其中第二个捕获组将捕获多次?

我希望第一个捕获组捕获 geo_locality(无需硬编码),第二个捕获组捕获 SeattleSan FranciscoChicago

我得到的最接近的是

(?<key>\w+)\.nomv="(?<val>.+?)(?=\|\|\||")

https://regex101.com/r/wmxg4x/1

val攻城组外,其他城市也需要攻城

试试这个模式:(?<_KEY_1>\w+)\.nomv="(?<_VAL_1>(.+?\|\|\|)+.+)"

需要注意的一点是,在捕获组 _VAL_1 中可以有更多的捕获组,但是 _VAL_1 是您所需要的。

DEMO.

您可以使用 alternation 如果支持正面回顾 (?<=

(?<_KEY_1>\w+)(?=\.nomv=")|(?<_VAL_1>(?<=\.nomv=")[A-Za-z ]+|(?<=\|\|\|)[A-Za-z ]+)

说明

  • (?<_KEY_1> 命名捕获组
    • \w+匹配一个或多个单词字符
  • ) 关闭命名捕获组
  • (?=\.nomv=") 肯定前瞻断言接下来是 .nomv="
  • |
  • (?<_VAL_1> 命名捕获组
    • (?<=\.nomv=") 积极的回顾,断言左边的是 .nomv=
    • [A-Za-z ]+ 匹配大写、小写或空格
    • |
    • (?<=\|\|\|) 积极的回顾,断言左边的是 |||
    • [A-Za-z ]+ 匹配大写、小写或空格
  • ) 关闭命名捕获组

答案取决于所使用的正则表达式风格。

  1. 使用\G在上一场比赛结束时使用PCRE

    继续
    (?<key>\w+)\.nomv="|(?!^)(?<=\G)(?<val>.+?)(?:\|\|\||")
    

    Demo

    \G 锚可能有点神秘,同时又很神奇。

解释:

  • (?<key>\w+)\.nomv="|第一次交替中的键和文字作为起始锚点
  • \G 锚断言位置在上一个匹配的末尾或第一个匹配的字符串的开头。

    • 排除我添加的字符串的开头 (?!^) 以防止匹配 nom=").
    • (?<=\G)所以,只有在
    • 之前有匹配的情况下我们才能继续
    • (?<val>.+?)根据需要捕获每个城市街区
    • (?:\|\|\||")非捕获组只是用来向前移动光标

  1. 在 .NET 中使用捕获

    (?<_KEY_1>\w+)\.nomv="(?:(?<_VAL_1>.+?)(?:\|\|\||"))*
    

    Demo

    这对 .NET 来说并不是真正的挑战。只需添加一个组和一个量词,并让 (?<val>) 匹配多次。然后,从 Captures.

  2. 中获取值