regex - 匹配全局,但仅当行以特定字符串开头时
问题描述
我觉得这应该很简单,我错过了一个重要的部分。
示例:https ://regex101.com/r/lXh5Vj/1
正则表达式,使用 /m/g 标志:
^GROUPS.*?"(?<name>[^:]+):(?<id>\d+)"
测试字符串:
GROUPS: ["group1:44343", "group2:23324", "group3:66567"]
USERS: ["user1:44343", "user2:23324", "user3:66567"]
我当前的正则表达式只会匹配 group1,因为只有那个组直接在“GROUPS”前面。我将此解释为“全局匹配”,这意味着它只会在第一次匹配后再次开始检查字符串。由于 group1 和 group2 之间没有“GROUPS”,因此 group2 不匹配。如果我更改测试字符串并在 group2 之前添加“GROUPS”,这也将匹配,支持我的怀疑。但我不知道如何更改全局匹配处理以始终考虑 GROUPS 行的开头。
正则表达式应匹配第一行中的 3 和 3,而第二行中不匹配。如果我从正则表达式中删除“GROUPS”部分,组匹配得很好,但也匹配第二行,这是我不想要的。
解决方案
如果要GROUPS: ["
在字符串的开头匹配命名组中的键:值部分,则可以使用\G
锚点。
(?:^GROUPS:\h*\["(?=[^][]*])|\G(?!^),\h*")(?<name>[^:]+):(?<id>\d+)"
(?:
非捕获组^GROUPS:\h*\[
字符串开头,匹配GROUPS:
可选空格和[
"(?=[^][]*])
匹配"
并断言]
右侧的关闭|
或者\G(?!^),\h*"
在上一场比赛结束时断言位置(以获得连续的组)并匹配逗号、可选空格和"
)
关闭非捕获组(?<name>[^:]+)
命名组name
匹配 1 次以上的任何字符,除了:
:
从字面上匹配(?<id>\d+)
命名组id
,匹配 1+ 位"
从字面上匹配
推荐阅读
- python - 通过对梯度小的地方进行平均来聚类数据
- python - 在 df2 列中以逗号分隔值合并 df1 列中的值的两个数据框
- javascript - 可拖动的 jQuery 元素
- python - 嵌入形式的不和谐私人消息不起作用
- three.js - 在 Autodesk forge 查看器中升级三个 js 版本
- javascript - 无法插入数组reactjs
- mysql - 致命错误:mysql.h:安装mariadb时没有这样的文件或目录
- python-3.x - 在 Selenium 中使用 HTML 标签导航到元素
- enterprise-architect - 如何将自定义 xml 文件导入我的 EA 模型
- visual-studio - 将 .NET Framework 4.8 迁移到 .NET 5