【问题标题】: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 一个很好的与字符串相关的问题。

标签: c# regex replace


【解决方案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);
    猜你喜欢
    • 1970-01-01
    • 2017-12-02
    • 2016-04-12
    • 2018-04-14
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多