使用RegEx进行多模式匹配

本文关键字:模式匹配 RegEx 使用 | 更新日期: 2023-09-27 18:22:02

我正在尝试使用RegEx将字符串拆分为多个对象。每条记录用一个:分隔,每个字段用一个~分隔。

所以样本数据看起来像:

:1~Name1:2~Name2:3~Name3

到目前为止,我拥有的RegEx是

:(?<id>'d+)~(?<name>.+)

然而,这只会匹配第一个记录,而我真的期望3。我如何让RegEx返回所有比赛而不仅仅是第一场比赛?

使用RegEx进行多模式匹配

您的最后一个.+是贪婪的,因此它吞噬了Name1以及字符串的其余部分。

尝试

:(?<id>'d+)~(?<name>[^:]+)

这意味着Name中不能有:(这可能对您的数据来说是可以的),并确保该名称不会进入下一个字段。

(还可以使用Regex.Matches方法,它可以获取所有匹配项,而不仅仅是第一个)。

使用:

var result = Regex.Matches(input, @":(?<id>'d+)~(?<name>[^:]+)").Cast<Match>()
    .Select(m => new 
    { 
        Id = m.Groups["id"].Value, 
        Name = m.Groups["name"].Value 
    });

您最好对字符串使用.split()方法。

String[] records = myString.split(':');
for(String rec : records)
{
    String[] fields = rec.split('~');
    //use fields
}