将 Regex.Matches 连接到一个字符串

Posted

技术标签:

【中文标题】将 Regex.Matches 连接到一个字符串【英文标题】:Concatenates Regex.Matches to a string 【发布时间】:2014-02-25 22:09:58 【问题描述】:

这是我在 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 呢?

【问题讨论】:

看看我的回答 【参考方案1】:

您可以尝试将结果转换为数组并应用string.Join 将您的字符串放在平面 在这里你必须明确指定Match 类型,因为MatchCollectionnon-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);

【讨论】:

【参考方案2】:

作为一个单行,这将是

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

强制转换的原因是 MatchCollection 只实现旧的非通用 IEnumerable 版本。

【讨论】:

【参考方案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有一个私有的setter,LINQsSelect不能被绕过,因为我们需要在Aggregate的lambda表达式中分配一个字符串。

【讨论】:

以上是关于将 Regex.Matches 连接到一个字符串的主要内容,如果未能解决你的问题,请参考以下文章

PythonPycharm Regex matches

如何将 JDBC 连接到 tns oracle

字符串分割

将列表的索引连接到字符串变量中

使用 for 循环将字母连接到字符串

将数组中的元素连接到字符串