我有一个看似简单的任务,但对我来说却不起作用。仅使用 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, three
。 Yellow
应作为第一组的新实例捕获
答案1
答案2
如果我理解正确的话,这个正则表达式应该适用于你的情况:
(?:^|\n)([^:]+):|(?:\s?)([^,\n]+)(?:,|$)
基本上,首先匹配从行首或换行符开始直到冒号的任何内容(?:^|\n)([^:]+):
。如果要包含冒号(如示例所示,但第一句话另有说明),只需移动捕获组以包含冒号即可。
然后您可以选择匹配以下短语:
(?:\s?)
- 未捕获的可选空格([^,\n]+)
- 任何非逗号或换行符的内容(?:,|$)
- 未捕获的逗号或行尾
演示:https://regex101.com/r/qOS9Hc/1
但正如我在问题下方的评论中提到的那样,我不确定你为什么要使用正则表达式。使用基本的文本处理会简单得多 - 用冒号拆分,然后用,
还要注意,这可以捕获其他类型的输入,除非你(?!^)(?<=\G)
在第二个替代方案的开头添加:
(?:^|\n)([^:]+):|(?!^)(?<=\G)(?:\s?)([^,\n]+)(?:,|$)
这确保了带有冒号的短语的第一个匹配出现在字符串的开头。