将 Regex.Matches 连接为字符串。

8
我有一个像这样的字符串:
string str = "key1=1;main.key=go1;main.test=go2;key2=2;x=y;main.go23=go23;main.go24=test24";

我使用这个模式来提取所有以main.开头的子字符串:

Regex regex = new Regex("main.[^=]+=[^=;]+");       
MatchCollection matchCollection = regex.Matches(str);

为了连接MatchCollection,我尝试了以下方法:

string flatchain = string.Empty;
foreach (Match m in matchCollection)
{
    flatchain = flatchain +";"+ m.Value; 
}

使用 LINQ 有更好的方法吗?


看一下我的回答。 - BRAHIM Kamel
3个回答

16
你可以尝试将你的结果转换成一个数组,然后使用string.Join将字符串放入数组中。在此处,你必须显式指定Match类型,因为MatchCollection是一个非泛型的IEnumerable类型。
  var toarray = from Match match in matchCollection select match.Value;
                string newflatChain = string.Join(";", toarray); 

或者如果你只想要一行,可以像下面这样做


string newflatChain = string.Join(";", from Match match in matchCollection select match.Value);

11

作为一行代码,这个会是:

var flatchain = string.Join(";", matchCollection.Cast<Match>().Select(m => m.Value));

造成需要进行类型转换的原因是MatchCollection只实现了旧版本的非泛型IEnumerable接口。


4

只需使用LINQ的Aggregate即可。例如:

var strIn = "key1=1;main.key=go1;main.test=go2;key2=2;x=y;main.go23=go23;main.go24=test24";

var strOut = Regex
             .Matches(str, "(main.[^=]+=[^=;]+)", RegexOptions.Multiline)
             .Cast<Match>()
             .Select(c => c.Value)
             .Aggregate(( a, b ) => a + ";" + b);
< p >< em >注意:由于< code >Match属性< code >Value具有私有设置器,因此需要在聚合的lambda表达式中分配字符串,无法绕过LINQ的< code >Select。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接