2016-01-13 134 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解析器進行清理。