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