【问题标题】:Replace All Format Chars Inside Quotation Marks替换引号内的所有格式字符
【发布时间】:2014-06-13 03:32:25
【问题描述】:

如果这些格式字符出现在两个引号 (") 之间,我有一个正则表达式应该用 ~ 字符替换所有格式字符 (\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, "~");

【问题讨论】:

  • 为什么要对字符类中的项目进行双重转义?
  • @AmalMurali 在 C# 中我认为我必须这样做,因为这些格式字符位于 2 个引号组内(嵌套两次)。也许我不需要?编辑:刚刚检查过,是的,C# 给出了一个带有 1 个转义字符的编译错误。

标签: c# regex parsing


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这里有两种不同的方法。

    • (1.) 负前瞻

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

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

      Live Demo

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

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

      Live Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 2011-07-18
      • 2022-11-17
      • 2013-09-24
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多