删除空格,除非在引号内,忽略转义引号

本文关键字:转义 空格 删除 | 更新日期: 2023-09-27 18:30:13

我有一个JSON字符串,我想在其中删除所有不在引号内的空格。我在网上搜索,我已经找到了一个解决方案,如下所示:

aidstring = Regex.Replace(aidstring, "''s+(?=([^'"]*'"[^'"]*'")*[^'"]*$)", "");

然而,我现在处理的是一个包含转义引号的字符串:

"boolean": "k near/3 '"funds private'""

上面的正则表达式解决方案将其转化为:

"boolean":"k near/3 '"fundsprivate'""

由于转义引号被视为普通引号。

有人能发布一个正则表达式,其中忽略转义引号吗?

删除空格,除非在引号内,忽略转义引号

我建议使用

aidstring = Regex.Replace(aidstring, @"(""[^""'']*(?:''.[^""'']*)*"")|'s+", "$1");

参见regex演示

正则表达式将所有引用C的字符串匹配到捕获组1中,使用$1时,这些字符串将在结果中恢复,但使用's+捕获的所有空白将被删除。

Regex解释

备选方案1:

  • ("[^"'']*(?:''.[^"'']*)*")
    • "-文字"
    • [^"'']*-除'"之外的零个或多个字符
    • (?:''.[^"'']*)*-零个或多个序列。。。
      • ''.-'和除换行符以外的任何字符
      • [^"'']*-除'"之外的零个或多个字符
    • "-文字"

备选方案2:

  • 's+-1个或多个空白(在.NET中,任何Unicode空白)

只是一个想法。。。这并不是立即看起来合法的,因为有明显的可能的缺陷。但如果你仔细想想,失败的可能性几乎为零:

Regex.Replace(aidstring, @"'"'s*:'s*'"", "'":'"");

长话短说,寻找想要替换的空间,而不是寻找所有不想替换的空间:

"boolean"    :    "k near/3 '"funds private'""
         ^^^^^^^^^

它唯一失败的时候是json对象的实际值内容实际上是冒号。。。请告诉我这种情况发生的频率。:)

但斯基特是最正确的。使用Json Parser进行清理。