首页 > 解决方案 > 用括号和逗号替换字符串中的逗号(如果它们不存在)

问题描述

我正在尝试如下操作和清理一串数据库列。

示例源字符串:

[foo],[bar],baz
[foo],bar,[baz]
[foo],[bar,[baz]
[foo],bar],[baz]
foo,bar,baz

(等等)

预期输出:

[foo],[bar],[baz]

我试图在字符串上运行以下正则表达式替换:

        string columnString = "[foo],[bar],baz";

        if (!Regex.IsMatch(columnString, @"^\[.*"))
        {
            columnString = string.Concat("[", columnString);}
        if (!Regex.IsMatch(columnString, @"^.*\]$"))
        {
            columnString = string.Concat(columnString,"]");
        }
        while (!Regex.IsMatch(columnString, @"^.*\],.*$"))
        {
            columnString = Regex.Replace(columnString, @",", @"],");}
        while (!Regex.IsMatch(columnString, @"^.*,\[.*$"))
        {
            columnString = Regex.Replace(columnString, @"\],", @"],[");
        }

虽然这修复了前括号和尾括号,但它(显然)不处理字符串中已经存在匹配项的逗号。

任何人都可以建议一种可以清理它的方法(它不必是正则表达式)。

干杯

标签: c#regexreplace

解决方案


我建议使用拆分和字符串重建解决方案:

var result = string.Join(
    ",", 
    s.Split(',') // split with commas
        .Select(x => !x.StartsWith("[") && !x.EndsWith("]") ? $"[{x}]" : x ) // add [ ] to items not starting and ending with [ ]
);

请参阅C# 演示

var strs = new List<string> { "[foo],[bar],baz", "[foo],bar,[baz]", "foo,bar,baz" };
foreach (var s in strs)
{
    var result = string.Join(",", s.Split(',').Select(x => !x.StartsWith("[") && !x.EndsWith("]") ? $"[{x}]" : x ));
    Console.WriteLine(result);
}

输出:

[foo],[bar],[baz]
[foo],[bar],[baz]
[foo],[bar],[baz]

更新

因为可能有[开头或]结尾的项目,您可以使用

var result = string.Join(
    ",", 
    s.Split(',')
        .Select(x => !x.StartsWith("[") || !x.EndsWith("]") ? 
            $"[{Regex.Replace(x, @"^\[|]$", "")}]" : x 
    )
);

请参阅此 C# 演示。结果:

[foo],[bar],[baz],[test]
[foo],[bar],[baz],[test]
[foo],[bar],[baz]

请注意,在字符串的开头和结尾Regex.Replace(x, @"^\[|]$", "")删除 a 。[]


推荐阅读