使用RegEx进行多模式匹配

时间:2012-01-31 06:36:28

标签: c# .net regex

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

分隔

示例数据如下所示:

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

我到目前为止的RegEx是

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

然而,这只会匹配第一条记录,而我真正期望的是3.如何让RegEx返回所有匹配而不仅仅是第一条?

3 个答案:

答案 0 :(得分:3)

你的上一个.+是贪婪的,所以它吞噬了Name1以及其他字符串。

尝试

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

这意味着名称中不能包含:(这对您的数据可能没问题),并确保名称不会进入下一个字段。

(并且还使用Regex.Matches方法来抓取所有匹配,而不仅仅是第一次)。

答案 1 :(得分:1)

使用:

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

答案 2 :(得分:1)

您最好使用.split()方法进行字符串处理。

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