2012-01-31 70 views
1

我想使用RegEx将字符串拆分为多个对象。每个记录由a分隔,每个字段由〜分开。使用正则表达式的多模式匹配

所以样本数据会看起来像:

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

正则表达式我至今是

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

然而,这只会匹配的第一条记录的时候,确实我希望3.如何我得到的RegEx返回所有比赛,而不仅仅是第一次?

回答

3

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

尝试

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

这意味着该名称不能在它:(这可能是为您的数据确定),并确保该名称不抢入下一场。

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

1

用途:

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

您更好地使用字符串.split()方法。

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