用括号和逗号替换字符串中的逗号(如果不存在)

时间:2019-02-12 05:56:49

标签: c# regex replace

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

示例源字符串:

[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, @"\],", @"],[");
        }

虽然这固定了前括号和后括号,但(显然)不会处理字符串中已经存在匹配项的逗号。

任何人都可以提出一种可以清除此问题的方法(不必使用正则表达式)。

欢呼

3 个答案:

答案 0 :(得分:1)

string str = "[foo],[bar],baz";
str = "[" + str.Replace("[", "").Replace("]", "").Replace(",", "],[") + "]";

请尽可能使用StringBuilder。我只是通过String类给了你一个主意。

答案 1 :(得分:1)

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

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# demo

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 
    )
);

请参见this C# demo。结果:

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

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

答案 2 :(得分:0)

如果要使用正则表达式,则答案如下:

var input = "[foo],bar,[baz]";
var regex = new Regex("((\\[?)((foo)|(bar)|(baz))(\\]?))");
var result = regex.Replace(input, "[$3]");

请参阅:https://dotnetfiddle.net/Afnn3m