Ответ 1
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)
.