Регулярное выражение для синтаксиса таблицы уценки? - PullRequest
2 голосов
/ 23 марта 2012

В настоящее время я разрабатываю небольшой инструмент , который позволяет мне конвертировать вики Github в страницы Github.Теперь я пытаюсь добавить правильную поддержку таблиц Markdown (не поддерживается анализатором, который я использую).

Теперь я подключаюсь к лексеру синтаксического анализатора, а затем расширяю его различными вики-настройками Github wiki (т.е. ссылки), а затем передать измененные токены обратно в синтаксический анализатор.Таблицы должны соответствовать этой схеме.Мои настройки используют различные шаблоны регулярных выражений и замену регулярных выражений для выполнения необходимых мне модификаций.

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

Я немного подумал об этом, и я думаю, что я хотел бы вывести регулярное выражение, которое выведет мне группу, содержащую заголовок (первая строка),данные выравнивания столбцов (вторая строка) и фактическое содержание в виде отдельных групп.Он должен содержать хотя бы одну строку содержимого, чтобы соответствовать.Данные заголовка и выравнивания также должны подчиняться определенным правилам, как показано в примерах.

Как бы вы подошли к созданию регулярного выражения, такого как этот?А еще лучше, может ли кто-нибудь дать мне отправную точку, на которой можно опираться?Возможно, мой подход ошибочен (возможно, можно избежать регулярных выражений?).Если так, то любые идеи, ведущие к тем же результатам, будут оценены по достоинству.

Ответы [ 4 ]

5 голосов
/ 14 апреля 2015

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

|(?:([^\r\n|]*)\|)+\r?\n\|(?:(:?-+:?)\|)+\r?\n(\|(?:([^\r\n|]*)\|)+\r?\n)+

Regular expression visualization

Демо Debuggex

Проверено с javascript

2 голосов
/ 19 февраля 2019

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

^(\|[^\n]+\|\r?\n)((?:\|:?[-]+:?)+\|)(\n(?:\|[^\n]+\|\r?\n?)*)?$

Флаги "Глобальный" и "Многострочный".

Хотя на самом деле это не основано на ответе Шона , в конечном итоге оно оказалось довольно схожим, с несколькими заметными отличиями, такими как то, что он немного короче, завершается за меньшее количество шагов (59 против 126 шагов, согласно regex101.com), и, вероятно, иметь более «разумные» группы захвата. Кроме того, он допускает и «неполные» таблицы. (Как ни в каком "теле"). (Причина, по которой я добавляю это в отдельном ответе, состоит в том, что я действительно нахожу это более полезным, плюс мое эго не позволило бы мне поступить иначе);).

В двух словах:

  • Это разрешит только «строгие» таблицы уценок, где каждая строка начинается и заканчивается символом |, а строка «выравнивания ячеек» правильно отформатирована.
  • Первая группа захватывает «голову», вторая группа - «выравнивание ячеек», а третья группа (необязательно) - «тело».
  • Ему нужна как минимум одна заполненная и правильно отформатированная ячейка "выравнивания", чтобы считать ее таблицей, но в противном случае она будет соответствовать неполным таблицам (т. Е. Без "тела").

Проверено на Java, (Android) и здесь:

Regex101

и здесь:

Демо Debuggex

Надеюсь, это кому-нибудь поможет. :)

2 голосов
/ 14 мая 2015

Что-то, что я сделал:

  1. Regex для анализа заголовка таблицы и разделителя !!

[|]?(\s+[A-Za-z0-9 -_*#@$%:;?!.,\/\\]+\s+)[|]?[|]?(\s+[A-Za-z0-9 -_*#@$%:;?!.,\/\\]+\s+)[|]?[|]?(\s+[A-Za-z0-9 -_*#@$%:;?!.,\/\\]+\s+)[|]?\r?\n?\|?:-+:\|?:-+:\|?:-+:\|?
- модификатор - глобальный

Regex для разделителя между заголовком и текстом

\|?:-+:\|?:-+:\|?:-+:\|?\r?\n?
- модификатор - global

Regex для анализа ВСЕХ элементов до и после разделителя заголовков!

[|]?(\s+[A-Za-z0-9 -_*#@$%:;?!.,\/\\]+\s+)[|]?[|]?(\s+[A-Za-z0-9 -_*#@$%:;?!.,\/\\]+\s+)[|]?[|]?(\s+[A-Za-z0-9 -_*#@$%:;?!.,\/\\]+\s+)[|]?\r?\n?

- модификаторы - глобальные, многострочные

Это таблица для анализа.

| Tables | Are | Cool | |:-------------:|:-------------:|:-----:| | col 3 is | r-l | $1600 | | col 2 is | centered | $12 | | zebra stripes | are neat | $1 |

1 голос
/ 26 марта 2012

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

Кстати, я нашел несколько регулярных выражений, которые могли бы соответствовать этой цели.См. MultiMarkdown .

...