Regex在特定单词处拆分字符串

本文关键字:拆分 字符串 单词处 Regex | 更新日期: 2023-09-27 18:25:43

我想使用.net Regex.Split方法将此输入string拆分为array。它必须将单词分组。

输入:**AAA**-1111,**AAA**-666,**SMT**-QWQE,**SMT**-TTTR

预期输出:

**AAA** : 1111,666
**SMT** : QWQE,TTTR

我需要使用什么模式?

Regex在特定单词处拆分字符串

正如问题注释所示,您不能在一个步骤中完成此操作(无论是否使用regex)。

因此:

  1. 用逗号分隔
  2. 在短划线上分开(但保持成对)
  3. 按每对的第一部分分组

类似于:

var result = select outer in input.Split(",")
             let p = outer.Split('-')  // will be string[2]
             select new { identifier = p[0], value = p[1] }
             into pair
             group by pair.identifier into g
             select new {
               identifier = g.Key
               values = String.Join(",", g)
             }

这应该会为您提供一个带有key字符串的IEnumerable和一个字符串列表(用逗号分隔),每个字符串前面都有values

var input =  "AAA-1111,AAA-666,SMT-QWQE,SMT-TTTR";
var list = input.Split(',')
                .Select(pair => pair.Split('-'))
                .GroupBy(pair => pair.First())
                .Select(grp => 
                            new{
                                key = grp.Key, 
                                items = String.Join(",", grp.Select(x => x[1])) 
                               });

然后,您可以像这样使用它(如果您只想输出值):

string output = "";
foreach(var grp in list)
{
    output += grp.key + ": " + grp.items + Environment.NewLine;
}

FWIW这里有同样的流畅语法解决方案,可能更容易理解:

string input = "AAA-1111,AAA-666,SMT-QWQE,SMT-TTTR";
Dictionary<string, string> output = input.Split(',') // first split by ','
    .Select(el => el.Split('-')) // then split each inner element by '-'
    .GroupBy(el => el.ElementAt(0), el => el.ElementAt(1)) // group by the part that comes before '-'
    .ToDictionary(grp => grp.Key, grp => string.Join(",", grp)); // convert to a dictionary with comma separated values

-

output["AAA"] // 1111,666
output["SMT"] // QWQE,TTTR