Многострочные регулярные выражения YAML для комментариев и пробелов - PullRequest
0 голосов
/ 04 апреля 2020

Как написать регулярное выражение в yaml на нескольких строках, которое при преобразовании в json представляет собой одну строку без лишних пробелов или комментариев?

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

Вот пример из их примера, сохраненный в syntaxes/abc.tmLanguage.yaml:

---
match: >
  (?x)
    \s*             # Leading whitespace
    (\[)([^]]+?)(\])(:)    # reference name
    [ \t]*       # optional whitespace
    (<?)(\S+?)(>?)     # The url
    (?:
        ((\().+?(\)))     # Match title in quotes
      | ((").+?("))    # or in parens
    )?       # Title is optional
    \s*     # Optional whitespace
    $
name: meta.link.reference.def.markdown

Затем я устанавливаю инструмент js -yaml , как предложено, и запускаю следующая команда:

$ npx js-yaml syntaxes/abc.tmLanguage.yaml > syntaxes/abc.tmLanguage.json

Сгенерированный файл syntaxes/abc.tmLanguage.json содержит все пробелы и комментарии

{
  "match": "(?x)\n  \\s*             # Leading whitespace\n  (\\[)([^]]+?)(\\])(:)    # reference name\n  [ \\t]*       # optional whitespace\n  (<?)(\\S+?)(>?)     # The url\n  (?:\n      ((\\().+?(\\)))     # Match title in quotes\n    | ((\").+?(\"))    # or in parens\n  )?       # Title is optional\n  \\s*     # Optional whitespace\n  $\n",
  "name": "meta.link.reference.def.markdown"
}

Затем я попытался вставить свой вышеупомянутый yaml в codebeautify.org , json2yaml.com , convert json .com и более, все с похожими результатами.

Я также пробовал несколько вариантов многострочных операторов yaml, таких как >-, |, |-, et c, но ни одна из них не решила проблему. Что я делаю неправильно?

1 Ответ

2 голосов
/ 04 апреля 2020

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

Вот разбивка почему YAML анализирует ваш ввод следующим образом:

Первая проблема - это своеобразное определение в спецификации c об обработке сложенных скаляров:

Строки, начинающиеся с символы пробела (более строки с отступом) не складываются.

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

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

Существует только два способа комментирования сложенного скаляра в YAML:

folded: >    # at the header line
  Lorem ipsum
  Dolor sit amet
 # At the end, with the initial `#` being less indented than the first line

Все остальное будет рассматриваться как содержание. Нельзя обойтись сложенными (>) или буквальными (|) скалярами.

...