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)。
因此:
- 用逗号分隔
- 在短划线上分开(但保持成对)
- 按每对的第一部分分组
类似于:
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