2016-01-13 129 views
0

我正在使用csharp,并有一个json字符串,我想删除所有不在引号内的空格。我在网上搜索,我已经找到了解决方案,这是这样的:csharp删除空格,除非在引号内,忽略转义引号

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

不过,我现在正在处理包含转义引号的字符串:

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

与上述正则表达式的解决方案圈它转换成:

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

因为转义引号被视为正常引号。 任何人都可以发布一个正则表达式,其中的转义引号会被忽略吗?

非常感谢!

乔瓦尼

+0

我最终的目标是我希望基金和私人这两个词保持两个单独的词,而不是被卡在一起 –

+2

我建议你使用JSON解析器来解析JSON,然后以紧凑的方式重新格式化它。使用正则表达式来处理这类事情最终会变得非常复杂。 –

+0

尝试['aidstring = Regex.Replace(aidstring,@“(”“[^”“\\] *(?:\\。[^”“\\] *)*”“)| \ s +”,“” $ 1" )'](http://regexstorm.net/tester?p=(%22%图5b%5E%22%5C%5C%5D *(%3F%3A%5C%5c所示。%图5b%5E%22 %5C%5C%5D *)*%22)%7C%5CS%2b是I =%22boolean%22%3A +%22K +邻近%2F3 +%5C%22funds +私人%5C%22%22&R =%241)。 –

回答

0

我建议使用

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

regex demo

正则表达式匹配所有的C引号的字符串为捕获组1和与$1这些字符串将在结果恢复,但所有被\s+捕获的空格都将被删除。

正则表达式的解释

替代品1:

  • ("[^"\\]*(?:\\.[^"\\]*)*")
    • " - 字面"
    • [^"\\]* - 其它的零个或多个字符比\"
    • (?:\\.[^"\\]*)* - 零个或更多序列...
      • \\. - \和任何字符,但换行符
      • [^"\\]* - 零个或多个字符以外\"
    • " - 字面"

替代方法2:

  • \s+ - 1或多个空白(英寸NET,任何Unicode空白)
1

只是一个想法......这并不立即看起来合法,因为有明显的可能的缺陷。但是,如果你仔细想想,哪里会失败的情况下几乎为零的几率发生的事情:

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

长话短说,找你WANT更换空间,而不是寻找所有空间的你不要想取代:

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

它会失败的唯一情况是,如果JSON对象的实际价值,内容是名副其实的结肠...让我知道发生的频率。 :)

但是Skeet是最正确的。使用Json解析器进行清理。