这是我在Stack上的第一个问题 我有一个像这样的字符串
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);
我试过这个来连接匹配集合
string flatchain = string.Empty;
foreach (Match m in matchCollection)
{
flatchain = flatchain +";"+ m.Value;
}
有没有更好的方法来使用LINQ?
答案 0 :(得分:10)
您可以尝试将结果转换为数组并应用string.Join
将字符串置于平面中
在这里,您必须明确指定Match
类型,因为MatchCollection
是non-generic 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);
答案 1 :(得分:6)
作为一个单行,这将是
var flatchain = string.Join(";", matchCollection.Cast<Match>().Select(m => m.Value));
强制转换的原因是MatchCollection只实现旧的非通用IEnumerable版本。
答案 2 :(得分:3)
只需使用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);
注意:由于Match
属性Value
具有私有设置器,因此无法绕过LINQ Select
,因为我们需要在Aggregate&#39中分配字符串; s lambda表达。