Сопоставление с образцом Lua по сравнению с регулярными выражениями

Я в настоящее время изучаю lua. относительно сопоставления с образцом в lua, я нашел следующее предложение в lua документации относительно lua.org:

Тем не менее, сопоставление с образцом в Lua является мощным инструментом и включает некоторые функции, которым трудно соответствовать стандартным реализациям POSIX.

Поскольку я знаком с posix регулярными выражениями, которые я хотел бы знать, существуют ли какие-либо общие образцы, где lua сопоставление с образцом "лучше" по сравнению с регулярным выражением - или я неправильно истолковывал предложение? и если существуют какие-либо типичные примеры: почему какое-либо сопоставление с образцом по сравнению с регулярными выражениями лучше удовлетворено?

62
задан Yu Hao 2 June 2014 в 01:32
поделиться

2 ответа

Есть ли какие-либо распространенные примеры, в которых сопоставление с образцом lua «лучше» по сравнению с регулярным выражением?

Это не столько конкретные примеры, сколько образцы Lua более высокое отношение сигнал / шум, чем в регулярных выражениях POSIX. Часто предпочтительнее общий дизайн, а не отдельные примеры.

Вот несколько факторов, которые способствуют хорошему дизайну:

  • Очень легкий синтаксис для сопоставления общих типов символов, включая прописные буквы (% u ), десятичные цифры (% d ), пробелы (% s ) и так далее. Любой тип символа может быть дополнен соответствующей заглавной буквой, поэтому шаблон % S соответствует любому непробельному символу.

  • Цитирование чрезвычайно простое и регулярное.Знак кавычек - % , поэтому он всегда отличается от символа кавычек строки \ , что значительно упрощает чтение шаблонов Lua, чем регулярные выражения POSIX (когда кавычки необходимы). Всегда безопасно заключать символы в кавычки, и никогда не нужно заключать в кавычки буквы, поэтому вы можете просто следовать этому практическому правилу, вместо того, чтобы запоминать, какие символы являются специальными метасимволами.

  • Lua предлагает «захват» и может возвращать несколько захватов в результате вызова match . Этот интерфейс намного, намного лучше, чем захват подстрок с помощью побочных эффектов или наличие некоторого скрытого состояния, которое нужно опросить, чтобы найти захваты. Синтаксис захвата прост: используйте круглые скобки.

  • В Lua есть модификатор «кратчайшего совпадения» - , который следует за оператором «самого длинного совпадения» * . Так, например, s: find '% s (% S -)%.' находит самую короткую последовательность непробельных символов, которой предшествует пробел и за которой следует точка.

  • Выразительная сила шаблонов Lua сравнима с «базовыми» регулярными выражениями POSIX, без оператора чередования | . Вы отказываетесь от "расширенных" регулярных выражений с | . Если вам нужна такая выразительная сила, я рекомендую полностью перейти к LPEG , который дает вам по существу возможности контекстно-свободных грамматик по вполне разумной цене.

67
ответ дан 24 November 2019 в 16:53
поделиться

http://lua-users.org/wiki/LibrariesAndBindings содержит список функций, включая библиотеки регулярных выражений, если вы хотите продолжить их использование.

Чтобы ответить на вопрос (и обратите внимание, что я ни в коем случае не гуру Lua), язык имеет сильную традицию использования во встроенных приложениях, где механизм полного регулярного выражения может чрезмерно увеличить размер используемого кода. на платформе, иногда намного больше, чем вся сама библиотека Lua.

[Edit] Я только что нашел в онлайн-версии Programming in Lua (отличный ресурс для изучения языка), где это описывается одним из принципов язык: см. комментарии ниже [/ Edit]

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

7
ответ дан 24 November 2019 в 16:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: