使用 PCRE2 正则表达式对冒号前的短语进行分组,并对逗号分隔的值进行分组

使用 PCRE2 正则表达式对冒号前的短语进行分组,并对逗号分隔的值进行分组

我有一个看似简单的任务,但对我来说却不起作用。仅使用 PCRE2 Regex(没有其他任何东西),我试图在行首的第一个冒号之前收集一个短语,然后分离并放置同一组内所有逗号分隔的值。

以下是一些示例文本:

Shapes: circle, rectangle, triangle  
Junk line: this part, here, should work, but: make sure, that last colon, isn't caught

应按如下方式捕获:

第 1 组:

Shapes:  

第 2 组:

circle  
rectangle  
triangle  

第 1 组:

Junk line:  

第 2 组:

this part  
here  
should work  
but: make sure  
that last colon  
isn't caught  

我知道逗号分隔的值可以通过多种方式捕获,如下所示:

([^,]+)

但是如果我尝试在开头添加任何内容,匹配会在第一个逗号后停止,因此:

(.*):([^,]+)

不起作用(而且它无论如何都会捕获一行中的第二个冒号)。任何帮助都非常感谢!

编辑并添加:匹配应该在行尾停止,因此如下所示:

One: two, three  
Yellow: Blue, Green  

不应Yellow作为其中的一部分捕获two, threeYellow应作为第一组的新实例捕获

答案1

使用 PCRE2,与语言无关,我会使用:

(^[^:]+:|\G(?!^))\h*([^,\r\n]+),?

演示与说明

答案2

如果我理解正确的话,这个正则表达式应该适用于你的情况:

(?:^|\n)([^:]+):|(?:\s?)([^,\n]+)(?:,|$)

基本上,首先匹配从行首或换行符开始直到冒号的任何内容(?:^|\n)([^:]+):。如果要包含冒号(如示例所示,但第一句话另有说明),只需移动捕获组以包含冒号即可。

然后您可以选择匹配以下短语:

  • (?:\s?)- 未捕获的可选空格
  • ([^,\n]+)- 任何非逗号或换行符的内容
  • (?:,|$)- 未捕获的逗号或行尾

演示:https://regex101.com/r/qOS9Hc/1

但正如我在问题下方的评论中提到的那样,我不确定你为什么要使用正则表达式。使用基本的文本处理会简单得多 - 用冒号拆分,然后用,

还要注意,这可以捕获其他类型的输入,除非你(?!^)(?<=\G)在第二个替代方案的开头添加:

(?:^|\n)([^:]+):|(?!^)(?<=\G)(?:\s?)([^,\n]+)(?:,|$)

这确保了带有冒号的短语的第一个匹配出现在字符串的开头。

相关内容