LINUX.ORG.RU
ФорумTalks

Слава человечеству! Человекочитаемые regexp`ы...


1

1

Некоторое время назад мне надо было для одного наколенного проекта написать парсер и я в очередной раз столкнулся с регулярными выражениями.
Потом в распаршиваемых данных что-то изменилось и надо было переделать регулярки но на этом мой энтузиазм закончился.
Для меня регулярки остались writeonly хренью, которую при изменении проще переписать, чем что-то там править.
Тем более, что мне приходится изучать их заново каждый раз перед использованием. Эта дрянь не держится у меня в голове дольше 2-3 дней.
Мне кажется я такой не один.
А давайте сделаем, пусть и более многословные, но понятные для неподготовленного человека регулярные выражения?
Например надо выколупать из

<a href="example.com">link</a>
домен и название. Пусть это выглядит как-то так:
{
  skip_until("\"");
  cut_out(LITERALS);
  skip_until(">");
  cut_out(LETTERS);
}
Добавить разных skip_while, skip_until и т.п.
А чтобы не изобретать велосипед с нуля просто транслировать этот код к классические регулярки.
Есть тут спецы по регулярным выражениям, которые могут сказать что-то кроме «Не нужно, нас и так всё устраивает»?

★★☆

Во дают фанаты xml. Кстати, это ни разу не регулярные выражения.

router ★★★★★
()

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

staseg ★★★★★
()

Пусть это выглядит как-то так

Поиск подстроки (strstr, или как оно в твоём языке) пробовал использовать? Попробуй.

Xellos ★★★★★
()

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

{
  ПРОПУСКАТЬ_ПОКА_НЕ_ВСТРЕТИМ("\"");
  СОБРАТЬ(ЗНАКИ);
  ПРОПУСКАТЬ_ПОКА_НЕ_ВСТРЕТИМ(">");
  СОБРАТЬ(БУКВЫ);
}

CARS ★★★★
()
Ответ на: комментарий от CARS

Ты хотел сказать на эсперанто?

Stahl ★★☆
() автор топика
Ответ на: комментарий от CARS

И скобочки, скобочки перевести. НАЧ_БЛОК и КОН_БЛОК.

Xellos ★★★★★
()
{
  skip_until("\"");
  cut_out(LITERALS);
  skip_until(">");
  cut_out(LETTERS);
}

я всегда думал что регулярные выражения придумали для того чтобы не надо было писать такие скрипты

crunchy_crow
()
Ответ на: комментарий от dmfd

На C++ нельзя. Доказано boost::spirit.

Какое это имеет отношение к спириту? В предложении ТС есть некий блок, переписав его на С++, получим вызовы функций skip_until, cut_out и т.д.

ЗЫ. Вообще регэспы и системы описания синтаксиса ЯП при некоторой схожестви, все же совершенно разные вещи.

staseg ★★★★★
()
Ответ на: комментарий от Stahl

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

Регексповский мусор нужен для сокращения кода. Хочешь развернуто разбирать текст, пиши ЭТО прямо в коде.

staseg ★★★★★
()
Ответ на: комментарий от Stahl

Это я предложил примитивнейший пример.

Вот примитивнейший парсинг IP-адресов с какого-то сайта, можешь переписать его в своём виде?


\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

Sadler ★★★
()
Ответ на: комментарий от Sadler

Гм. Пока не могу.
Если бы я уже сформулировал идею в достаточном для реализации виде, то я пришёл бы сюда не с таким тредом, а с ссылкой на либу и словами:«Кому надо — пользуйтесь, кому не надо проходите мимо».

Stahl ★★☆
() автор топика
Ответ на: комментарий от staseg

Иногда удобно хранить подобные вещи где-то в конфигах, чтобы для мелких изменений не перекомпилировать проект.
Поэтому вариант с парсингом средствами языка неудобен.

Stahl ★★☆
() автор топика
Ответ на: комментарий от Sadler

Oh, shit... Зачем же проверку на диапазон забивать в само выражение? ИМХО, никто не мешает проверить после

\b(?:(\d+)\.){3}(\d+)\b

router ★★★★★
()

Эта дрянь не держится у меня в голове дольше 2-3 дней

Вот тут корень проблемы.

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

Хочешь «понятливые для неподготовленного человека регулярные выражения» — используй regexp'ы с ключём /x.

theNamelessOne ★★★★★
()

понятные для неподготовленного человека регулярные выражения

неподготовленный человек может идти варить борщ

thesame ★★★★
()
Ответ на: комментарий от Stahl

Гм. Пока не могу.

Я это к тому, что, если переписывать правила по регекспу, получится нечто вроде: http://pastebin.com/1g4xQTgu . Так что твой регексп по-хорошему должен иметь какие-то дополнительные функции, чтобы его код не разрастался до таких монстров.

Sadler ★★★
()

не нужно же

регулярные выражения и так понятны

George
()
Ответ на: комментарий от Suigintou

На C++ можно. Доказано Qt.

Два чаю этому джентельмену!

MikeDM ★★★★★
()
Ответ на: комментарий от Sadler

Я понимаю это.
Я ведь не предлагаю делать «расшифровку» регулярок для людей.
Я предлагаю делать регулярки на базе другого «языка».
И этот язык не обязан быть в духе регулярок как они есть сейчас. Он лишь обязан быть в любом случае переводимым в регулярные выражения.

Stahl ★★☆
() автор топика

«Не нужно, нас и так всё устраивает»

/thread

Harald ★★★★★
()
Ответ на: комментарий от Stahl

а как же прекрасные однострочники на перле, если вместо регулярок будет такая простыня?

George
()

Я понял. Ты хочешь SQL только для регекспов. Но всё равно ненужно и неудобно.

Xellos ★★★★★
()
Ответ на: комментарий от Xellos

SQL только для регекспов

Ну... Гм... Как-то так, да. Что-то близкое, наверное. Может быть и так.
:)
Я просто хочу чтобы я понимал что говорю машине.
Я за свою жизнь на машинном коде написал от силы 500-600 байт и больше не хочу. Для меня регулярки не лучше. Хочу ассемблерные мнемокоды!

Stahl ★★☆
() автор топика
Ответ на: комментарий от kovrik

XPath is used to navigate through elements and attributes in an XML document

И каким это боком к данному треду? Ты бы мне ещё pidgin посоветовал, ибо он XMPP поддерживает.

Stahl ★★☆
() автор топика
Ответ на: комментарий от kovrik

Ты упорот, да?
Ну каким боком тут вообще HTML?
Мы, вроде, про регулярные выражения говорим, разве нет?

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

Ну берёшь значит синтаксис регекспов и переводишь. То есть:
. => MUSTBE_ONE
? => MAYBE_ONE
* => MAYBE_ONE_OR_MORE
+ => MUSTBE_ONE_OR_MORE
[ => SYMGROUP_BEGIN
] => SYMGROUP_END

и так далее.
То есть ^([wx])([yz]) - будет как-то так
STRING_START
MEMORY_BEGIN
SYMGROUP
'w' OR 'x'
END_SYMGROUP
MEMORY_END
MEMORY_BEGIN
SYMGROUP
'y' OR 'z'
END_SYMGROUP
MEMORY_END

Только это совсем не то что ты начал предлагать. Потому что регулярное выражение - это декларация. Описание. А ты начал предлагать механизм. Механизмов же есть как минимум два, и лучше тебе в них не лезть.

Xellos ★★★★★
()
Ответ на: комментарий от Xellos

Может у тебя в этом проблема? В том, что ты совершенно не понимаешь СУТИ регулярных выражений? Что это не механизм, не инструкция, это декларация, шаблон?

Xellos ★★★★★
()
Ответ на: комментарий от George

Мне тоже помогла, но у меня не было изначального страха перед этими ужасными и непонятными символами.

Xellos ★★★★★
()
Ответ на: комментарий от Stahl

Ты в примере парсишь html. Руглярками это не надо делать. Тем более, если ты вместо регулярок изобретаешь свой велосипед.
Не нравятся регулярки - описывай грамматику в БНФ и на ее основе делай парсер.

kovrik ★★★★★
()

В студию врываются комбо-брэйкеры!

expr ::= expr '+' expr
       | expr '-' expr
       | '(' expr ')'
       | NUM ;

или

expr ::= expr '.' ID '(' actuals ')' ;

actuals ::= actuals ',' expr | expr ;

ave left-recursive!

stevejobs ★★★★☆
()
Ответ на: комментарий от staseg

получим вызовы функций skip_until, cut_out и т.д.

Как сделать без комбинаторов, например, альтернативы? В регулярках ЕМНИП они есть, значит и транслировать их нужно в комбинаторы. К примеру в spirit.

Вообще регэспы и системы описания синтаксиса ЯП при некоторой схожестви, все же совершенно разные вещи.

Мне что-то кажется, что область применения одного — подмножество другого.

dmfd
()
Ответ на: комментарий от kovrik

поняв принцип работы регулярок, легко можно распарсить HTML. но двух минут чтения манула по регуляркам к твоему любимому ЯП для этого явно недостаточно

George
()
Ответ на: комментарий от Xellos

Ну как-то так, НО!
Дословный перевод оставит в силе мозголомность конструкции плюс добавит ей длины. Т.е. в итоге получится может даже ещё хужею

Stahl ★★☆
() автор топика

А комментарии в выражениях использовать что мешает?

vsemnazlo
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.