匹配全局,但前提是行以特定字符串开头
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+ 个数字
"
字面匹配
我觉得这应该很简单,我遗漏了一个重要的部分。
示例: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+ 个数字"
字面匹配