首页 > 解决方案 > 匹配全局,但仅当行以特定字符串开头时

问题描述

我觉得这应该很简单,我错过了一个重要的部分。

示例: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”部分,组匹配得很好,但也匹配第二行,这是我不想要的。

标签: regexpcre

解决方案


如果要GROUPS: ["在字符串的开头匹配命名组中的键:值部分,则可以使用\G锚点。

(?:^GROUPS:\h*\["(?=[^][]*])|\G(?!^),\h*")(?<name>[^:]+):(?<id>\d+)"
  • (?:非捕获组
    • ^GROUPS:\h*\[字符串开头,匹配GROUPS:可选空格和[
    • "(?=[^][]*])匹配"并断言]右侧的关闭
    • |或者
    • \G(?!^),\h*"在上一场比赛结束时断言位置(以获得连续的组)并匹配逗号、可选空格和"
  • )关闭非捕获组
  • (?<name>[^:]+)命名组name匹配 1 次以上的任何字符,除了:
  • :从字面上匹配
  • (?<id>\d+)命名组id,匹配 1+ 位
  • "从字面上匹配

正则表达式演示


推荐阅读