Вот несколько надежных регулярных выражений, которые вы можете использовать.Он не идеален - в частности, он не работает в некоторых угловых случаях, когда сами значения содержат json-подобный текст, но он будет работать в большинстве общих случаев:
quoted_json = unquoted_json.gsub(/([{,]\s*)(\w+)(\s*:\s*["\d])/, '\1"\2"\3')
Сначала он ищет либо {
или ,
, которые являются опциями для символа, предшествующего имени ключа (также допускается любое количество пробелов с \s*
).Он захватывает это как группу:
([{,]\s*)
Затем он захватывает сам ключ, который состоит из букв, цифр и символов подчеркивания (для которого удобно использовать регулярное выражение \w
класс символов):
(\w+)
Наконец, оно соответствует тому, что должно следовать за именем ключа;то есть двоеточие, за которым следует либо начальная кавычка (для строкового значения), либо цифра (для числового значения).Также допускает дополнительные пробелы и захватывает все в группе:
(\s*:\s*["\d])
Для каждого матча он просто складывает три фигуры вместе, но с кавычками вокруг ключа (поэтому кавычки вокруг группы захвата # 2):
'\1"\2"\3'