匹配全局,但前提是行以特定字符串开头

Match global, but only if line starts with a specific string

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

示例: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,在第二行匹配 none。如果我从正则表达式中删除“GROUPS”部分,这些组就会很好地匹配,但也会匹配第二行,这是我不想要的。

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

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

Regex demo