Regex.Replace(myJSON, "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1")
dovrebbe farlo. Si assicura che le stringhe che contengono i caratteri dello spazio siano conservate e tutti gli altri caratteri dello spazio vengano scartati. Tutte le parole chiave JSON (false
, true
, null
) devono essere separate da virgole o altri segni di punteggiatura, pertanto è necessario conservare solo lo spazio bianco all'interno delle stringhe.
La prima opzione (\"(?:[^\"\\\\]|\\\\.)*\")
corrisponde una stringa doppia citato. Il (...)
significa che l'output viene catturato e disponibile nella sostituzione come $1
. Lo [^\"\\\\]
corrisponde a qualsiasi carattere tranne una virgoletta doppia o un carattere di escape \
.
Poiché la corrispondenza si verifica da sinistra a destra, la seconda opzione, \s+
non corrisponde allo spazio all'interno di una stringa.
Quindi corrispondiamo a stringhe intere e spazi all'esterno delle stringhe. Nel primo caso, $1
è il token di stringa e, nel secondo caso, $1
è la stringa vuota perché il gruppo 1 non è stato utilizzato.
Questo funziona come previsto perché
- gli unici gettoni in JSON che possono contenere spazi sono stringhe tra doppi apici. Non ci sono stringhe o commenti con citazione singola in JSON.
- la grammatica JSON richiede la punteggiatura di un singolo carattere tra tutti i token multi-carattere, quindi la rimozione dello spazio non unirà i token. In JavaScript, questo potrebbe essere problematico perché lo spazio è necessario per rompere i token;
var x=0
è diverso da varx=0
e x - -(y)
è diverso da x--(y)
.
fonte
2012-01-18 15:56:07