Сравнение шаблонов Lua с регулярными выражениями - PullRequest
62 голосов
/ 22 апреля 2010

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

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

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

Ответы [ 3 ]

67 голосов
/ 23 апреля 2010

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

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

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

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

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

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

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

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

7 голосов
/ 22 апреля 2010

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

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

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

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

1 голос
/ 02 мая 2012

Хорошо, просто небольшая заметка для этого обсуждения; Эта страница меня особенно смутила:

Регулярные выражения SciTE

, поскольку тот говорит, что \s соответствует пробелу, как я знаю из других синтаксисов регулярных выражений ... И поэтому я пробую это в оболочке:

$ lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> c="   d"
> print(c:match(" "))

> print(c:match("."))

> print(c:match("\s"))
nil
> print("_".. c:match("[ ]") .."_")
_ _
> print("_".. c:match("[ ]*") .."_")
_   _
> print("_".. c:match("[\s]*") .."_")
__

Хммм ... кажется \s здесь не распознается - так что страница, вероятно, ссылается на регулярное выражение в Scite Find / Replace, а не на синтаксис регулярного выражения Lua (который также использует scite).

Затем я перечитываю lua-users wiki: Patterns Tutorial и начинаю получать комментарий о том, что escape-символ %, а не \ в ответе @ NormanRamsey, Итак, попробуем это:

> print("_".. c:match("[%s]*") .."_")
_   _

... действительно работает.

Итак, так как я изначально думал, что «шаблоны» Луа - это команды / движки, отличные от «регулярного выражения» Луа, я думаю, что лучший способ сказать это так: «шаблоны» Луа являются Луа- специфический синтаксис / механизм "регулярных выражений" (другими словами, их не два :))

Ура!

...