首页 > 解决方案 > 正则表达式创建两个捕获组,其中第二个捕获多次

问题描述

我的测试字符串是

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

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

我希望第一个捕获组捕获geo_locality(没有硬编码),第二个捕获组捕获Seattle,San FranciscoChicago.

我得到的最接近的是

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

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

除了val占领组还需要占领其他城市。

标签: regexregex-lookaroundsregex-group

解决方案


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

  1. 使用\GPCRE 在上一场比赛结束时继续

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

    演示

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

解释:

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

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

  1. 在 .NET 中使用捕获

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

    演示

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

在此处输入图像描述


推荐阅读