PCRE реализует негативную перспективу И за совместную работу? - PullRequest
0 голосов
/ 18 февраля 2019

Привет всем,

У меня есть небольшая проблема, которую я явно не могу решить.Это включает в себя PCRE, реализующую негативную перспективу И за условиями, которые должны (но явно не работают) работать вместе.

Что я пытаюсь сделать:

У меня есть строка, содержащая константу вJavaScript-совместимый синтаксис.Синтаксис этой строки необходимо преобразовать, чтобы он соответствовал стандартам JSON.

Проблема, с которой я сталкиваюсь:

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

Пример ввода (все JS):

const Const = {
  propertyKeyA: "someValue",
  propertyKeyB: ["ThisIsMyHeadache:ItShouldNotBeChanged"]
};

Желаемый вывод:

{
  "propertyKeyA": "someValue",
  "propertyKeyB": ["ThisIsMyHeadache:ItShouldNotBeChanged"]
}

Мой подход PCRE:

$output = preg_replace(
  '~(?:^|\b)    (?![\'"])  (\w+)  (?<![\'"])     :~mx',
  '"\1":',
  $input
);

, что приводит к:

{
  "propertyKeyA": "someValue",
  "propertyKeyB": [""ThisIsMyHeadache":ItShouldNotBeChanged"]
}

Обратите внимание на двойные кавычки в определении массива.Мне кажется, что условия вообще не работают.

У кого-нибудь есть идеи, как это решить?Было бы безмерно оценили!

Best, Крис

Ответы [ 2 ]

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

Как написано Wiktor в комментариях к моему первоначальному вопросу, это решение:

'~(?:^|\b) (?<![\'"]) (\w+) (?![\'"]) :~mx'
0 голосов
/ 18 февраля 2019

Вы смешали позиции взглядов вперед и назад.

(?![\'"])(\w+) равно (\w+), потому что (?![\'"]) является отрицательным взглядом вперед и требует, чтобы следующий символ не был ' или ", но поскольку следующим шаблоном является \w, соответствующий слову char, упреждающий просмотр становится избыточным.Вы должны использовать отрицательный взгляд здесь, (?<![\'"]) (\w+).И проблема с (\w+)(?<![\'"]) аналогична: слово char не может быть ' и ", а отрицательный взгляд позади избыточен.Вы хотели lookahead здесь.

Вам нужно использовать

'~(?:^|\b) (?<![\'"]) (\w+) (?![\'"]) :~mx'

См. regex demo .

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