LUA образец сопоставления против регулярных выражений

StackOverflow https://stackoverflow.com/questions/2693334

  •  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. Ваш пробег может варьироваться.

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

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

так как один говорит \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 (другими словами, не два из них :) )

Ваше здоровье!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top