Regex.Replace(myJSON, "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1")
должен это сделать. Он гарантирует, что строки, содержащие символы пробела, сохраняются, а все остальные символы пробега удаляются. Все ключевые слова JSON (false
, true
, null
) должны быть разделены запятыми или другими пунктуациями, поэтому необходимо сохранить только белые пробелы внутри строк.
Первый вариант (\"(?:[^\"\\\\]|\\\\.)*\")
соответствует строке с двойными кавычками. (...)
означает, что выход фиксируется и доступен при замене как $1
. [^\"\\\\]
соответствует любому символу, кроме символа двойной кавычки или escape-кода \
.
Поскольку соответствие происходит слева направо, второй вариант, \s+
не будет соответствовать пробелу внутри строки.
Таким образом, мы сопоставляем целые строки и пробелы вне строк. В первом случае $1
является символом строки, а в последнем случае $1
является пустой строкой, потому что группа 1 не использовалась.
Это работает как задумано, потому что
- только лексемы в формате JSON, которые могут содержать пробелы в двойных кавычках. В JSON нет ни капли строк, ни комментариев.
- JSON-грамматика требует односимвольной пунктуации между всеми символами многосимвольного символа, поэтому удаление пространства не будет сливать токены. В JavaScript это может быть проблематично, потому что пространство должно ломать токены;
var x=0
отличается от varx=0
и x - -(y)
отличается от x--(y)
.