LUA образец сопоставления против регулярных выражений
-
01-10-2019 - |
Вопрос
Я в настоящее время изучаю Луа. Что касается сопоставления с шаблоном в Луа, я обнаружил следующее предложение в документации LUA на Lua.org:
Тем не менее, сопоставление шаблона в LUA является мощным инструментом и включает в себя некоторые функции, которые трудно сопоставить со стандартными реализациями POSIX.
Как я знаком с регулярными выражениями POSIX, я хотел бы знать, есть ли какие-либо общие образцы, где сопоставление шаблона LUA - это «лучше» по сравнению с регулярным выражением - или я не ошибочноинтересировал предложение? И если есть какие-либо общие примеры: почему какое-либо из шаблонов сопоставлено против регулярных выражений лучше подходящих?
Решение
Есть ли какие-либо общие образцы, где сопоставление шаблона LUA «лучше» по сравнению с регулярным выражением?
Это не очень настолько конкретные примеры, так как узоры Lua имеют более высокий соотношение сигнал-шума, чем POSIX регулярные выражения. Это общий дизайн, который часто предпочтительнее, не определенные примеры.
Вот некоторые факторы, которые способствуют хорошему дизайну:
Очень легкий синтаксис для сопоставления общих типов символов, включая прописные буквы (
%u
), десятичные цифры (%d
), космические персонажи (%s
) и так далее. Любой тип символов может быть дополнен с использованием соответствующей заглавной буквы, поэтому шаблон%S
соответствует любому несущему персонажу.Цитирование чрезвычайно просто и регулярно. Цитируемый персонаж
%
, так что он всегда отличается от цитирующего цитирования струны\
, что делает шаблоны LUA намного проще читают, чем POSIX регулярные выражения (при необходимости цитирования). Это всегда безопасно для цитата символов, и их никогда не нужно цитировать буквы, поэтому вы можете просто пойти с помощью этого правила, а не запоминать, какие символы являются специальными метасимвотами.Lua предлагает «захватывание» и может вернуть несколько захватов в результате
match
вызов. Этот интерфейс гораздо лучше, чем захватывать подстроки через побочные эффекты или иметь некоторое скрытое состояние, которое должно быть допрошено, чтобы найти захватывающие. Захват синтаксис прост: просто используйте скобки.У Луа есть «кратчайший матч»
-
Модификатор, чтобы пойти вместе с «самым длинным матчем»*
оператор. Так, напримерs:find '%s(%S-)%.'
Находит кратчайшую последовательность немнозных символов, которые предшествуют пространству и сопровождаются точкой.Выразительная мощность шаблонов LUA сопоставима с POSIX «Основные» регулярные выражения, без оператора чередования
|
. Отказ То, что вы отказываетесь, это «расширенные» регулярные выражения с|
. Отказ Если вам нужна значительная выразительная сила, я рекомендую идти весь путь к Lepeg Что дает вам по существу способность без контекстных грамматиков в довольно разумной стоимости.
Другие советы
http://lua-users.org/wiki/librariesandbindings. Содержит список функциональных возможностей, включая библиотеки Regex, если вы хотите продолжить их использовать.
Чтобы ответить на вопрос (и обратите внимание, что я ни в коем случае не являюсь LUA GURU), язык имеет сильную традицию использования в встроенных приложениях, где полный механизм регулятора REGELEX будет чрезмерно увеличить размер кода, который используется на платформе Иногда намного больше, чем просто вся сама библиотека Lua.
Править] Я только что нашел в онлайн-версии программирования в LUA (отличный ресурс для изучения языка), где это описано одним из принципов языка: см. Комментарии ниже [/ Edit
Лично я нахожу, что сопоставление по умолчанию LUA обеспечивает удовлетворение большим количеством потребностей Regex-Y. Ваш пробег может варьироваться.
Хорошо, просто небольшое нобор заметки для этой дискуссии; Я особенно запутался этой страницей:
так как один говорит \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 - не на синтаксис Regex Lua (который также использует SCITE).
Тогда я перечитаю Луа-пользователи Wiki: Учебное пособие, и начните получать комментарий об эвале %
, нет \
в @Normanramsey.Ответ. Итак, попробую это:
> print("_".. c:match("[%s]*") .."_")
_ _
... действительно работает.
Итак, как я изначально подумал, что «шаблоны» Луа являются разными командами / двигателем от «регулярного выражения выражения Луа», я думаю, что лучший способ сказать: «Шаблоны Lua» являются Синтаксис / двигатель «регулярное выражение« регулярного выражения »LUA (другими словами, не два из них :)
)
Ваше здоровье!