正则表达式创建两个捕获组,其中第二个捕获多次
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
(无需硬编码),第二个捕获组捕获 Seattle
、San Francisco
和 Chicago
。
我得到的最接近的是
(?<key>\w+)\.nomv="(?<val>.+?)(?=\|\|\||")
https://regex101.com/r/wmxg4x/1
除val
攻城组外,其他城市也需要攻城
试试这个模式:(?<_KEY_1>\w+)\.nomv="(?<_VAL_1>(.+?\|\|\|)+.+)"
。
需要注意的一点是,在捕获组 _VAL_1
中可以有更多的捕获组,但是 _VAL_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 ]+
匹配大写、小写或空格
)
关闭命名捕获组
答案取决于所使用的正则表达式风格。
使用\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.
中获取值
我的测试字符串是
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
攻城组外,其他城市也需要攻城
试试这个模式:(?<_KEY_1>\w+)\.nomv="(?<_VAL_1>(.+?\|\|\|)+.+)"
。
需要注意的一点是,在捕获组 _VAL_1
中可以有更多的捕获组,但是 _VAL_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 ]+
匹配大写、小写或空格
)
关闭命名捕获组
答案取决于所使用的正则表达式风格。
使用
继续\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. 中获取值