如何为逗号分隔的字符串编写具有匹配组的正则表达式

Posted

技术标签:

【中文标题】如何为逗号分隔的字符串编写具有匹配组的正则表达式【英文标题】:How can I write a Regex with matching groups for a comma separated string 【发布时间】:2021-06-23 18:07:12 【问题描述】:

我有一个随机输入字符串来验证和标记化。

我的目的是检查我的字符串是否具有以下模式

[a-zA-Z]2\d2 (one or unlimited times) comma separated

So:
aa12,af43,ad46 -> is valid
,aa12,aa44 -> is NOT valid (initial comma)
aa12, -> is NOT valid ( trailing comma)

这是第一部分,验证 然后,使用相同的正则表达式,我必须为每次出现的模式创建一个组(匹配集合)

所以:

aa12,af34,tg53
is valid and must create the following groups
Group 1 -> aa12
Group 2 -> af34
Group 3 -> tg53

是否可以仅使用一个验证和创建组的正则表达式来完成?

这是我写的

    ^([a-zA-Z]2\d2)(?:(?:[,])([a-zA-Z]2\d2)(?:[,])([a-zA-Z]2\d2))*(?:[,])([a-zA-Z]2\d2)*|$

但即使它或多或少正确地创建了组,它也缺少验证过程,也会得到具有错误模式的字符串。

非常欢迎任何提示

【问题讨论】:

(一次或无限次) - 这意味着您可以拥有任意数量的 csv 字符串? 【参考方案1】:

你可以使用

var text = "aa12,af43,ad46";
var pattern = @"^(?:([a-zA-Z]2\d2)(?:,\b|$))+$";
var result = Regex.Matches(text, pattern)
        .Cast<Match>()
        .Select(x => x.Groups[1].Captures.Cast<Capture>().Select(m => m.Value))
        .ToList();
foreach (var list in result)
    Console.WriteLine(string.Join("; ", list));
# => aa12; af43; ad46

请参阅 C# demo online 和 regex demo。

正则表达式详细信息

^ - 字符串开头 (?:([a-zA-Z]2\d2)(?:,\b|$))+ - 出现一次或多次 ([a-zA-Z]2\d2) - 第 1 组:两个 ASCII 字母,然后是两个数字 (?:,\b|$) - , 后跟单词字符或字符串结尾 $ - 字符串结束。如果您想防止匹配尾随换行符、LF、字符,您可以使用\z

【讨论】:

您有一个错误,因为组在逗号存在时包含逗号,并且应该排除它。我建议将\b 描述为“单词的开头”或“单词边界”更好。 @NetMage 错字出现在正则表达式演示中,而不是在线代码中。而\b这里的意思是,后面必须跟一个字符。

以上是关于如何为逗号分隔的字符串编写具有匹配组的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

java 正则表达式匹配字符串,包含没有数字的单词,并且可以选择用逗号分隔

正则表达式匹配逗号分隔的数字与可选的小数部分

正则表达式从字符串中提取用逗号分隔的字符串

用于逗号分隔文本的 Mysql 正则表达式

正则表达式:允许逗号分隔的字符串,包括字符和非字符

使用正则表达式匹配多个逗号分隔的单词