Regex.Replace(myJSON, "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1")
powinien to zrobić. Upewnia się, że łańcuchy zawierające znaki spacji są zachowane, a wszystkie pozostałe znaki spacji są odrzucane. Wszystkie słowa kluczowe JSON (false
, , , null
) muszą być oddzielone przecinkami lub inną interpunkcją, więc tylko białe spacje wewnątrz łańcuchów muszą zostać zachowane.
Pierwsza opcja (\"(?:[^\"\\\\]|\\\\.)*\")
dopasowuje podwójny ciąg znaków. (...)
oznacza, że dane wyjściowe są przechwytywane i dostępne w zastępstwie jako $1
. Znak [^\"\\\\]
dopasowuje dowolny znak, z wyjątkiem podwójnego cudzysłowu lub znaku ewakuacyjnego \
.
Ponieważ dopasowanie występuje od lewej do prawej, druga opcja, \s+
, nie będzie pasowała do spacji w ciągu znaków.
Tak więc dopasowujemy całe łańcuchy i spacje na zewnątrz ciągów. W pierwszym przypadku token ciągowy, $1
jest tokenem łańcuchowym, aw drugim przypadku $1
jest pustym łańcuchem, ponieważ grupa 1 nie była używana.
ten działa zgodnie z przeznaczeniem, bo
- tylko tokeny w JSON, który może zawierać spacji są podwójnych cudzysłowów. W JSON nie ma pojedynczych cudzysłowów ani komentarzy.
- Gramatyka JSON wymaga interpunkcji pojedynczego znaku między wszystkimi tokenami wieloznakowymi, więc usunięcie miejsca nie spowoduje scalenia żetonów. W JavaScript może to być problematyczne, ponieważ do złamania tokenów wymagane jest miejsce;
var x=0
różni się od varx=0
i x - -(y)
różni się od x--(y)
.