需要正则表达式来关闭或替换引号

时间:2011-01-13 13:19:21

标签: c# regex

请帮我解决我的问题。 我有一个以下字符串列表:

a
"b
c"
"ddd"
'ee'
a"b"c
a'b'c

因此我需要:

"a"
"b"
"c"
"ddd"
"ee"
"a\"b\"c"
"a'b'c"

请帮我写替换版。

3 个答案:

答案 0 :(得分:3)

正如其他人在评论中已经注意到的那样:这不是正则表达式的工作。事实上,如果你尝试这样做,你将得到的代码 可读性和可操作性,而不是直截了当的想法。

string.Concat("\"", myString.Trim('"', '\'').Replace("\"","\\\""), "\"");

PowerShell测试:

PS Home:\> filter fixString { '"' + $_.Trim('"', "'").Replace('"', '\"') + '"' }
PS Home:\> 'a','"b','c"','"ddd"',"'ee'",'a"b"c',"a'b'c" | fixString
"a"
"b"
"c"
"ddd"
"ee"
"a\"b\"c"
"a'b'c"

但是,如果你迫切需要正则表达式,我只能想到以下三个单独的替换:

myString = Regex.Replace(myString, @"^['""]|['""]$", "");
myString = Regex.Replace(myString, @"""", @"\""");
myString = Regex.Replace(myString, "^|$", @"""");

PowerShell测试:

PS Home:\> 'a','"b','c"','"ddd"',"'ee'",'a"b"c',"a'b'c" |
>> % { $_ -replace '^[''"]|[''"]$' -replace '"','\"' -replace '^|$','"' }
"a"
"b"
"c"
"ddd"
"ee"
"a\"b\"c"
"a'b'c"

以下仅使用两个正则表达式,感谢Toader Mihai Claudiu提供了一些重要的建议:

myString = Regex.Replace(@"^['""]?(.*?)['""]?$", @"""$1""");
myString = Regex.Replace(@"(?<=.)""(?=.)", @"\""");

PowerShell测试:

PS Home:\> 'a','"b','c"','"ddd"',"'ee'",'a"b"c',"a'b'c" |
>> % { $_ -replace '^[''"]?(.*?)[''"]?$','"$1"' -replace '(?<=.)"(?=.)','\"' }
"a"
"b"
"c"
"ddd"
"ee"
"a\"b\"c"
"a'b'c"

现在问问自己:从现在起一个月内你还能知道代码的作用吗?可能一年?

答案 1 :(得分:1)

不知道C#语法,但我认为你应该分三个简单的步骤。

对于每个字符串:    - 剥离开始和结束报价(如果有的话)。    - 逃离字符串。    - 添加开始和结束报价。

应该易于实施。

答案 2 :(得分:1)

你应该手动完成。添加“在缓冲区中,跳过字符串中的第一个字符,如果"'将每个非"添加到缓冲区并引用每个"(又名将其转换为\")。最后(不要添加引用",直到你有一个不同于"的下一个字符),只需添加一个未引用的"如果最后一个字符是"'

您可以使用2个正则表达式搜索和替换来执行此操作,但如上所述更有效。