使用c#删除字符串中[]括号之间的逗号's

本文关键字:之间 删除 字符串 使用 | 更新日期: 2023-09-27 18:05:40

我想从字符串中删除方括号[]之间的逗号,而不是整个逗号。

这里是我的字符串,<>之前的字符串结果= " a, b, c, c, d, e, f, g, h, i, j]";

期望输出:

<>之前的a, b, c, (cde), f, g, [hij] 之前

谢谢。

使用c#删除字符串中[]括号之间的逗号's

正如我所写的,您需要一个简单的状态机(内括号,外括号)…然后,对每个字符进行分析,如果有必要,更改状态机的状态,并决定是否需要输出它。

public static string RemoveCommas(string str) 
{
    int bracketLevel = 0;
    var sb = new StringBuilder(str.Length);
    foreach (char ch in str) 
    {
        switch (ch) {
            case '[':
                bracketLevel++;
                sb.Append(ch);
                break;
            case ']':
                if (bracketLevel > 0) {
                    bracketLevel--;
                }
                sb.Append(ch);
                break;
            case ',':
                if (bracketLevel == 0) {
                    sb.Append(ch);
                }
                break;
            default:
                sb.Append(ch);
                break;
        }
    }
    return sb.ToString();
}

使用方式:

string result = "a,b,c,[c,d,e],f,g,[h,i,j]";
Console.WriteLine(RemoveCommas(result));

请注意,为了"保存"状态机的状态,我使用了int,因此它可以与递归括号一起工作,如a,b,[c,d,[e,f]g,h]i,j

作为一个有趣的练习,它可以用一个较慢的LINQ表达式来完成:

string result2 = result.Aggregate(new 
{
    BracketLevel = 0,
    Result = string.Empty,
}, (state, ch) => new {
    BracketLevel = ch == '[' ? 
        state.BracketLevel + 1 : 
            ch == ']' && state.BracketLevel > 0 ? 
                state.BracketLevel - 1 : 
                state.BracketLevel,
    Result = ch != ',' || state.BracketLevel == 0 ? state.Result + ch : state.Result
}).Result;

最后的代码非常相似…有一个状态(BracketLevel)加上正在构建的字符串(Result)。请不要使用,它只是作为LINQ的一个有趣的片段。

正则表达式方法

string stringValue = "a,b,c,[c,d,e],f,g,[h,i,j]";
var result = Regex.Replace(stringValue, @",(?![^']]*(?:'[|$))", string.Empty);

如果没有嵌套括号

你可以试试:

var output = new string(result
                         .Where((s, index) => s != ',' ||
                                              IsOutside(result.Substring(0, index)))
                         .ToArray()
                       );
//output: a,b,c,[cde],f,g,[hij]

private static bool IsOutside(string value)
{
     return value.Count(i => i == '[') <= value.Count(i => i == ']');
}

但请记住,这不是做这项工作的有效方法。