c# - 用括号和逗号替换字符串中的逗号(如果它们不存在)
问题描述
我正在尝试如下操作和清理一串数据库列。
示例源字符串:
[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, @"\],", @"],[");
}
虽然这修复了前括号和尾括号,但它(显然)不处理字符串中已经存在匹配项的逗号。
任何人都可以建议一种可以清理它的方法(它不必是正则表达式)。
干杯
解决方案
我建议使用拆分和字符串重建解决方案:
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 。[
]