Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Регулярные выражения 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]*") .."_")
__

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

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

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

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

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

Ура!