regex - 正则表达式创建两个捕获组,其中第二个捕获多次
问题描述
我的测试字符串是
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
占领组还需要占领其他城市。
解决方案
答案取决于正则表达式的风格。
使用
\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中获取值。
推荐阅读
- azure-web-app-service - 如何使用 dotnet core 3.1 LTS 创建 Windows 应用服务?
- prolog - 在Prolog中找到平方不大于N的最大整数
- python - 如何减少内存使用这个程序递归
- python - 在 python3.7 虚拟环境中安装 pysftp 时出错
- python - 你将如何为这个贪婪算法 qns 编写代码,我们必须选择玩家的路线,但路线不能重复?
- azure - 构建策略失败时的电子邮件发送选项
- reactjs - react 15中根据复选框状态添加或删除数据
- bash - Anaconda(conda),如何只显示非基础环境
- python - matplotlib 子图之间的箭头
- bash - 适用于 awk v4.0.2 但不适用于 >= 4.2.1 的 awk 表达式