Обработка строк с дополнительным разделителем - PullRequest
0 голосов
/ 03 марта 2019

Мне нужно обработать файл с набором строк в следующем формате:

{name:value}
  • Имя может иметь :, которое экранируется с помощью \.
  • : является необязательным, в этом случае необходимо прочитать только имя.
  • Если : нет, значение отсутствует.Значение может также содержать }, которое экранируется с помощью \.

Итак, допустимые значения:

{john:nice person}
{john} 

Я использовал это регулярное выражение:

{(?<name>.*?(?=(?<!\\)\:))(?<separator>:?)(?<value>.*?(?=(?<!\\)\}))}

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

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Попробуйте это:

\{((?:[^\n:]|(?<=\\):)+)(?::((?:[^:\n}]|(?<=\\)})+))?}

См. live демо .

0 голосов
/ 03 марта 2019

Попробуйте \{(?<name>(?:[^:}]|\\:)+)(?:(?<!\\):(?<value>(?:[^}]|\\\})+))?(?<!\\)\}

Я сгруппировал разделитель и значение вместе в необязательную группу (?:)?

...