【问题标题】:Concatenates Regex.Matches to a string将 Regex.Matches 连接到一个字符串
【发布时间】: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 呢?

【问题讨论】:

  • 看看我的回答

标签: c# .net regex linq c#-4.0


【解决方案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表达式中分配一个字符串。

      【讨论】:

        猜你喜欢
        • 2011-06-17
        • 2016-01-17
        • 1970-01-01
        • 2013-05-15
        • 2012-02-02
        • 1970-01-01
        • 2022-06-17
        • 2022-12-17
        • 1970-01-01
        相关资源
        最近更新 更多