REGEX - как заменить слово перед двоеточием на само слово в двойных кавычках - PullRequest
0 голосов
/ 07 февраля 2019

у меня есть "json", подобный этому:

{
   example:"hi there",
   dateTime: "01/01/1970 bla:bla"
}

я должен заменить все значения перед двоеточием, заключив их в двойную кавычку.

Ссылаясь на этот ответ Regexв рубине, чтобы заключить слово раньше: с двойными кавычками , я попробовал код, но еще не полностью правильно, потому что он также изменил значение перед двоеточием в dateTime.

, поэтому я должен добавить кэтот код

(\w+)(?=:)

другой элемент управления, который проверяет, находится ли слово сразу после запятой.

Я хотел бы изменить, поэтому"JSON" для реального JSON, как это:

  {
       "example":"hi there",
       "dateTime": "01/01/1970 bla:bla"
    }

и не так, как сейчас:

{
   "example":"hi there",
   "dateTime": "01/01/1970 "bla":bla"
}

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Если вы можете полагаться на положение значений, подлежащих замене в начале строки, как в вашем примере, вы можете использовать регулярное выражение, например ^ +([a-zA-Z0-9_]*):, которое соответствует только последовательностям буквенно-цифровых символов и подчеркиваний переддвоеточие и предшествует ноль или более пробелов и захватывает последовательность в качестве первой группы.

Вы можете увидеть, используя онлайновый валидатор регулярных выражений , что сопоставляется / захватывается, а что нет для вводапример, который вы показали.

Затем вы можете использовать захваченную группу, чтобы обернуть интересующий вас текст в двойные кавычки.

Простой пример запуска в JS:

var input = `{
   example:"hi there",
   dateTime: "01/01/1970 bla:bla"
}`

var regexp = /^[ \t]+([a-zA-Z0-9_]*):/mg

var replaced = input.replace(regexp, '"$1":')

console.log(replaced)

ОБЪЯСНЕНИЕ: m флаг включает многострочный совпадение, g флаг включает совпадение всех режим

Я не могу показать вам пример Ruby, но предоставленное регулярное выражение должно помочь вам!

0 голосов
/ 07 февраля 2019

Ваш шаблон (\w+)(?=:) соответствует 1+ символу слова, где справа стоит двоеточие.Это будет соответствовать bla:

То, что вы могли бы сделать, это расширить этот положительный прогноз, чтобы он соответствовал 1+ разу символа слова \w+, а затем использовать положительный прогноз, чтобы утверждать, что справа - двоеточие, за которым следуетдвойная кавычка, совпадение между ними и закрывающая двойная кавычка.

Обратите внимание, что сопоставление не относится к какой-либо структуре данных и зависит от того, что находится справа от совпадения.

Затем в замене вы можете заключить совпадение в кавычки.

\w+(?=:\s*"[^"]+")

Это соответствует:

  • \w+ Соответствует 1+ символам слов
  • (?=Позитивный взгляд на утверждение правого совпадения
    • \s* Совпадение 0+ раз с пробелом
    • *"[^"]*" Совпадение с использованием отрицательного класса символов при открытии будет закрывающей кавычкой, а между.
  • ) Закрыть взгляд

Regex demo | Пример использования Ruby

0 голосов
/ 07 февраля 2019

Вот решение для выбора всех атрибутов и замены (см. Демонстрацию):

Для всех букв алфавита:

/(?:[a-z]+(?=:[" ]))/ig

Для буквенно-цифровых символов и подчеркивания:

/(?:[\w]+(?=:[" ]))/g

Демо :

https://www.regextester.com/?fam=107535

?: используется для создания группы без обратных ссылок.Следовательно, увеличивает скорость вычислений , поскольку ему не нужно запоминать группу для повторного использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...