我的测试字符串是
thread_id=1152236, geo_locality.nomv="Seattle|||San Francisco|||Chicago", user_reference_count=0
是否有可能使一个 正则表达式具有两个捕获组,而第二个捕获组将捕获多次?
我希望第一个捕获组捕获geo_locality
(无硬编码),第二个捕获组捕获Seattle
,San Francisco
和Chicago
。
我最近的是
(?<key>\w+)\.nomv="(?<val>.+?)(?=\|\|\||")
https://regex101.com/r/wmxg4x/1
除了val
捕获组之外,还需要捕获其他城市。
答案 0 :(得分:2)
答案取决于游戏中的正则表达式味道。
使用\G
在上一场比赛结束时继续使用PCRE
(?<key>\w+)\.nomv="|(?!^)(?<=\G)(?<val>.+?)(?:\|\|\||")
\G
的锚点可能有点奥秘,同时又真的很神奇。
说明:
(?<key>\w+)\.nomv="|
第一个交替中的键和文字充当开始锚点 \G
锚在上一个匹配项的末尾或第一个匹配项的字符串开头声明位置。
(?!^)
的开头,以防止在nom="
之前出现匹配项。(?<=\G)
因此,我们只有在之前有匹配项的情况下才能继续(?<val>.+?)
根据需要捕获每个城市街区(?:\|\|\||")
非捕获组仅用于将光标向前移动通过.NET使用捕获
(?<_KEY_1>\w+)\.nomv="(?:(?<_VAL_1>.+?)(?:\|\|\||"))*
这不是.NET的真正挑战。只需在周围添加一个组和一个量词,然后让(?<val>)
匹配多次。然后,从Captures获取值。
答案 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.