替换引号内的所有格式字符

时间:2014-06-13 03:32:26

标签: c# regex parsing

我有一个正则表达式,应该用\t, \r\, \n, \v, whitespace字符替换所有格式字符(~)如果这些格式字符出现在两个引号(")之间。

我的代码没有产生所需的结果,而是用~替换第一个引号然后剩下的。 我的正则表达式有什么问题,以及如何使其达到我想要的效果?

对于以下字符串:name "Right \r\nCurb"
结果应为:name "Right~~~Curb"
但我的代码正在产生:name ~Right \r\nCurb"

我的代码:

const string delimeters = "(\"*[\\t\\r\\n\\v\\b\\s]\")";
var openBrkRgx = new Regex(delimeters);
line = openBrkRgx.Replace(line, "~");

2 个答案:

答案 0 :(得分:1)

使用此模式[\t\r\n\v\s](?!(([^"]*"){2})*[^"]*$)
并替换为~
Demo

答案 1 :(得分:1)

以下是两种不同的方法。

  • 1.否定前瞻

    Regex.Replace(input, @"\s(?!(([^""]*""){2})*[^""]*$)", "~");
    

    注意:在NET中,\s本身匹配任何 Unicode分隔符,制表符,换行符,回车符,垂直制表符,换页符,下一行 < / p>

    Live Demo

  • 2.)匹配引号,然后进行替换:( 建议 ..)

    Regex.Replace(input, @"""[^""]+""", 
                  m => m.Value.Replace(' ',  '~')
                              .Replace("\t", "~")
                              .Replace("\r", "~")
                              .Replace("\n", "~")
                  );
    

    Live Demo