我有一个看似简单的任务,但对我不起作用。仅使用 PCRE2 Regex(仅此而已),我试图在一行开头的第一个冒号之前收集一个短语,然后将所有逗号分隔值分开并放在同一组中。
以下是一些示例文本:
形状:圆形、矩形、三角形
垃圾线:这部分在这里应该可以工作,但是:确保最后一个冒号没有被捕获
应该这样捕获:
第 1 组:
形状:
第 2 组:
圆形
矩形
三角形
第 1 组:
垃圾行:
第 2 组:
这部分
在这里
应该可以工作
但是:确保
没有捕获到
最后一个冒号
我知道逗号分隔值可以通过多种方式捕获,如下所示:
([^,]+)
但是,如果我尝试在开头添加任何内容,匹配将在第一个逗号后停止,因此:
(.*):([^,]+)
将不起作用(加上它无论如何都会捕获一行中的第二个冒号)。任何帮助表示赞赏!
编辑添加:匹配应该在行尾停止,所以是这样的:
一:二、三
黄:蓝、绿
不应将“黄色”作为“二、三”的一部分进行捕捉。“黄色”应该作为第一组的新实例被捕获
如果我理解正确的话,这个正则表达式应该适用于你的情况:
基本上,首先匹配从行首或换行符到冒号的任何内容
(?:^|\n)([^:]+):
。如果你想包含冒号(如示例所示,但第一句另有说明),只需移动捕获组以包含冒号。然后你有一个匹配短语的替代方案,包括:
(?:\s?)
- 非捕获的可选空白([^,\n]+)
- 任何不是逗号或换行符的东西(?:,|$)
- 未捕获的逗号或行尾演示: https: //regex101.com/r/qOS9Hc/1
但正如我在问题下方的评论中提到的那样,我不确定你为什么要为此使用正则表达式。基本文本处理要简单得多 - 按冒号拆分,然后按
,
另请注意,这可以捕获其他类型的输入,除非您
(?!^)(?<=\G)
在第二个备选方案的开头添加:这确保带冒号的短语的第一个匹配项出现在字符串的开头。
使用独立于语言的 PCRE2,我会使用:
演示与解释