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

Posted

技术标签:

【中文标题】用括号和逗号替换字符串中的逗号(如果它们不存在)【英文标题】:Replacing commas in a string with brackets and commas if they don't exist 【发布时间】:2019-07-05 17:17:44 【问题描述】:

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

示例源字符串:

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

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

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

干杯

【问题讨论】:

为什么不直接用逗号分开,检查每一项是否有括号,然后重新加入? 我想我真的认为我需要使用正则表达式(即使我知道还有其他选择)。感谢您提供简单的解决方案(为什么我会过度思考这些东西;)) 我发布了fixed solution, please check。 +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, @"^\[|]$", "") 会删除字符串开头的 [ 和结尾的 ]

【讨论】:

谢谢。是的,这将处理没有任何括号的拆分字符串,这通常是它们的呈现方式。但是如果其中一个字符串的一侧有一个括号,它会忽略它。该解决方案需要考虑所有场景(这会变得有点笨拙) @Ash 然后添加测试用例。您没有迹象表明这种情况会发生 @Ash 用新的解决方案更新了答案。 @Ash 你看,即使我在解决方案 2 中使用正则表达式,由于首先拆分字符串,所以模式非常简单,只删除需要删除的内容:一个且只有一个 @ 987654333@ 在开头或一个且只有一个 ] 在字段末尾。【参考方案2】:
string str = "[foo],[bar],baz";
str = "[" + str.Replace("[", "").Replace("]", "").Replace(",", "],[") + "]";

如果可能,请使用StringBuilder。我刚刚用String 类给了你一个想法。

【讨论】:

【参考方案3】:

如果你想使用正则表达式,这里是答案:

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

请看:https://dotnetfiddle.net/Afnn3m

【讨论】:

谢谢。作为给出示例的纯粹答案,是的,这似乎很好。不幸的是,我认为要让它在现实世界的示例中工作,我不需要拆分输入并构建动态正则表达式吗? 如果要使用动态正则表达式,可以试试:dotnetfiddle.net/I4mIdAvar regex = new Regex("((\\[?)([a-z]+)(\\]?))", System.Text.RegularExpressions.RegexOptions.IgnoreCase);

以上是关于用括号和逗号替换字符串中的逗号(如果它们不存在)的主要内容,如果未能解决你的问题,请参考以下文章

用逗号分割字符串,但忽略括号或引号中的逗号

用记事本++中的正则表达式替换引号中的所有逗号

java用if语句要怎么判断一个字符串里是不是有逗号?

如何使用php用“and”替换字符串中的最后一个逗号?

用 TextField 中的小数分隔符替换逗号

PHP:用逗号分割字符串,但不是在大括号或引号之间?