Regex 匹配全局,但仅当行以特定字符串开头时

Regex 匹配全局,但仅当行以特定字符串开头时,regex,pcre,Regex,Pcre,我觉得这应该很简单,我遗漏了一点重要的东西 例如: Regex,使用/m/g标志: ^GROUPS.*?"(?<name>[^:]+):(?<id>\d+)" 我当前的正则表达式将只匹配group1,因为只有该组前面直接有“GROUPS”。我将其解释为“全局匹配”,这意味着它只会在第一次匹配后再次开始检查字符串。由于group1和group2之间没有“组”,因此group2不匹配。如果我修改测试字符串并在group2之前添加“GROUPS”,这也将匹

我觉得这应该很简单,我遗漏了一点重要的东西

例如:

Regex,使用/m/g标志:

^GROUPS.*?"(?<name>[^:]+):(?<id>\d+)"
我当前的正则表达式将只匹配group1,因为只有该组前面直接有“GROUPS”。我将其解释为“全局匹配”,这意味着它只会在第一次匹配后再次开始检查字符串。由于group1和group2之间没有“组”,因此group2不匹配。如果我修改测试字符串并在group2之前添加“GROUPS”,这也将匹配,支持我的怀疑。但是我不知道如何改变全局匹配处理,总是考虑行组的开始。< /P>
正则表达式应该在第一行中匹配3和3,在第二行中不匹配。如果我从正则表达式中删除“GROUPS”部分,组就可以很好地匹配,但是还可以匹配第二行,这是我不想要的。

如果要匹配
组:[“
在字符串的开头,以及指定组中的键:值部分,可以使用
\G

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

关于与
(?:\G(?!\A)\^组)的多个匹配情况如何?“\K(?[^:+):(?\d+)”
?请参阅。或者使用方括号
(?:^GROUPS[^]*\[(?=[^][*])“\G(?)(?[^:+:(?\d+”
请以答案的形式提供答案,而不是注释:)。Wiktor:您的解决方案非常有效!第四只鸟:您的解决方案与“,”匹配。”在群名之前也是如此,所以不理想。@Senshi是的,发布的答案是不同的。我将删除评论。效果很好!还感谢您解释各个部分的作用。修复了我的问题,让我学到了一些东西。
(?:^GROUPS:\h*\["(?=[^][]*])|\G(?!^),\h*")(?<name>[^:]+):(?<id>\d+)"