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

时间:2018-08-03 04:13:12

标签: regex regex-lookarounds regex-group

我的测试字符串是

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捕获组之外,还需要捕获其他城市。

3 个答案:

答案 0 :(得分:2)

答案取决于游戏中的正则表达式味道。

  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获取值。

enter image description here

答案 1 :(得分:1)

如果支持(?<=,则可以使用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 ]+匹配大写,小写或空白
  • )关闭命名的捕获组

答案 2 :(得分:0)

尝试以下模式:(?<_KEY_1>\w+)\.nomv="(?<_VAL_1>(.+?\|\|\|)+.+)"

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

请参见DEMO.