.NET中的String Splitter

5 .net c#

我有以下字符串

P,MV,A1ZWR,MAV#(X,,), PV,MOV#(X,12,33),LO
Run Code Online (Sandbox Code Playgroud)

我需要输出为

P

MV

A1ZWR

MAV#(X,,)

PV

MOV#(X,12,33)

LO
Run Code Online (Sandbox Code Playgroud)

可以看出,通过","拆分可以轻松完成,但问题来了

当它是MAV#(X ,,)或MOV#(X,12,33)类型时.

请帮忙

Guf*_*ffa 8

您可以使用正则表达式匹配分隔符之间的值,并指定parantheses中的所有内容都是值的一部分.例:

string data = "P,MV,A1ZWR,MAV#(X,,), PV,MOV#(X,12,33),LO";

foreach (Match m in Regex.Matches(data, @"\s*((\(.*?\)|[^,])*)(,|$)")) {
  Console.WriteLine(m.Groups[1].Value);
}
Run Code Online (Sandbox Code Playgroud)

输出:

P
MV
A1ZWR
MAV#(X,,)
PV
MOV#(X,12,33)
LO
Run Code Online (Sandbox Code Playgroud)

  • 应该提到的是,只要有嵌套括号,它就会中断.此外,作为设计问题,您的解决方案的一个缺点是它会通过跳过/丢失条目(而不是抛出)而无声地失败. (3认同)

Mar*_*náš 4

由于仅使用 LINQ 没有这样的解决方案,而且我对它的外观很感兴趣,所以我想出了这个。但我不建议在生产代码中使用它。实际上我希望它会更好,但由于需要处理嵌套括号,我不得不引入可变状态变量。

string data = "P,MV,A1ZWR,MAV#(X,,), PV,MOV#(X,12,33),LO";

int depth = 0;
int group = 0;

var result = data
    .GroupBy(x => { 
        if (x == '(') depth++;
        if (x == ')') depth--;
        if (x == ',' && depth == 0) group++; 
        return group; })
    .Select(x => new String(x.ToArray()).Trim(' ', ','))
Run Code Online (Sandbox Code Playgroud)