我正在尝试如下操作和清理一串数据库列。
示例源字符串:
[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, @"\],", @"],[");
}
虽然这固定了前括号和后括号,但(显然)不会处理字符串中已经存在匹配项的逗号。
任何人都可以提出一种可以清除此问题的方法(不必使用正则表达式)。
欢呼
答案 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]");