半复合字符串替换?

时间:2013-08-07 17:59:24

标签: c# string replace

我有这个文字

'Random Text', 'a\nb\\c\'d\\', 'ok'

我希望它成为

'Random Text', 'a\nb\c''d\', 'ok'

这个问题正在逃避。我没有使用\进行转义,而是仅使用'转义''。这是针对第三方程序,所以我无法更改它,因此需要将一个转义方法更改为另一个。

问题是\\'。如果我进行字符串替换,它将变为\''而不是\'。此外,\n不是换行符,而是不应修改的实际文本\n。我尝试使用正则表达式,但如果'替换为''\\替换为\,我无法想办法说出{{1}}。显然,分两步执行此操作会产生问题。

如何正确替换此字符串?

2 个答案:

答案 0 :(得分:6)

如果我正确理解了您的问题,则问题在于将\\替换为\,如果它发生在'之前,则会导致另一个替换。一种技术是首先将它替换为中间字符串,确保在其他任何地方都不会出现,然后在完成后将其替换回来。

var str = @"'Random Text', 'a\nb\\c\'d\\', 'ok'";
str.Replace(@"\\", "NON_OCCURRING_TEMP")
    .Replace(@"\'", "''")
    .Replace("NON_OCCURRING_TEMP", @"\");

正如@AlexeiLevenkov指出的那样,您也可以使用Regex.Replace同时进行两种修改。

Regex.Replace(str, @"(\\\\)|(\\')",
    match => match.Value == @"\\" ? @"\" : @"''");

答案 1 :(得分:3)

似乎voithos对这个问题的解释是正确的。另一种方法是使用RegEx一次查找所有令牌并替换ReguarExpression.Replace

起点:

var matches = new Regex(@"\\\\'|\\'|'");
Console.Write(matches.Replace(@"'a b\nc d\\e\'f\\'", 
   match =>"["+match + "]"));