2012-01-31 42 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 
}