我正在学习lua。关于lua中的模式匹配,我在lua.org上的lua文档中找到了以下句子:
然而,Lua中的模式匹配是一个功能强大的工具,包含一些难以与标准POSIX实现相匹配的功能。
由于我熟悉posix正则表达式,我想知道是否有任何常见的样本,其中lua模式匹配与正则表达式相比“更好” - 或者我是否误解了句子?如果有任何常见的例子:为什么模式匹配与正则表达式中的任何一个更适合?
答案 0 :(得分:65)
与正则表达式相比,lua模式匹配的常见样本是否“更好”?
Lua模式具有比POSIX正则表达式更高的信噪比,这不是特别的例子。总体设计通常是优选的,而非特定的例子。
以下是有助于良好设计的一些因素:
非常轻量级的语法,用于匹配常见字符类型,包括大写字母(%u
),十进制数字(%d
),空格字符(%s
)等。任何字符类型都可以使用相应的大写字母来补充,因此模式%S
匹配任何非空格字符。
引用非常简单且有规律。引号字符为%
,因此它始终与字符串引用字符\
不同,这使得Lua模式比POSIX正则表达式更容易阅读(当需要引用时)。引用符号始终是安全的,并且永远不必引用字母,因此您可以按照经验法则而不是记住哪些符号是特殊的元字符。
Lua提供“捕获”,并且可以通过match
调用返回多个捕获。这个界面比通过副作用捕获子串或者有一些必须被查询以找到捕获的隐藏状态要好得多。捕获语法很简单:只需使用括号。
Lua有一个“最短匹配”-
修饰符,与“最长匹配”*
运算符一起使用。因此,例如s:find '%s(%S-)%.'
找到最短的非空格字符序列,前面是空格,后跟一个点。
Lua模式的表现力与POSIX“基本”正则表达式相当,没有交替运算符|
。你放弃的是|
的“扩展”正则表达式。如果你需要那么强大的表达能力,我建议一直到LPEG,这样就可以以合理的成本为你提供基于上下文的语法的强大功能。
答案 1 :(得分:7)
http://lua-users.org/wiki/LibrariesAndBindings包含一系列功能,包括正则表达式库,如果您希望继续使用它们。
为了回答这个问题(并注意到我不是Lua大师),该语言在嵌入式应用程序中有着强大的传统,其中完整的正则表达式引擎会过度增加所使用代码的大小在平台上,有时候比Lua图书馆本身还要大得多。
[编辑]我刚刚在Lua编程的在线版本(学习语言的优秀资源)中找到了这种语言的原理之一:请参阅下面的评论 [/编辑]
我个人认为,与Lua匹配的默认模式满足了我的大部分正则表达式需求。你的旅费可能会改变。
答案 2 :(得分:1)
好的,这个讨论只是一个轻微的noob笔记;我特别对这个页面感到困惑:
因为那个人说\s
匹配空格,正如我从其他正则表达式语法中所知的那样......所以我在shell中尝试它:
$ 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的查找/替换中的正则表达式 - 而不是Lua的正则表达式语法(scite也使用)。
然后我重新阅读lua-users wiki: Patterns Tutorial,并开始在@NormanRamsey的答案中获取有关转义字符%
而不是\
的评论。所以,试试这个:
> print("_".. c:match("[%s]*") .."_")
_ _
......确实有效。
所以,正如我原先认为Lua的“模式”是Lua的“正则表达式”不同的命令/引擎,我想更好的方式是:Lua的“模式”是 Lua特定的“正则表达式”语法/引擎(换句话说,它们中没有两个:)
)
干杯!
答案 3 :(得分:1)
冒着因说实话而被否决的风险,我会坦率地说实话(毕竟答案应该是这样):除了能够为单个匹配呼叫返回多个捕获 (可能在正则表达式中,但以更复杂的方式)和 %bxy
模式匹配一对平衡分隔符(例如所有类型的括号等)和被认为是有用的、强大的和“更好的”,几乎 Lua 模式可以做的一切,正则表达式也可以做。
另一方面,Lua 模式与正则表达式相比,在“特性”方面的缺点很明显,而且提到的太多(例如,缺少 OR、缺少非捕获组、环视表达式等)。现在,如果 Lua 模式比通常较慢的正则表达式快得多,那么这将是平衡的,但我不确定是否 - 以及在哪里 - 这样的比较存在,因为它的原因会排除一般的本地 Lua 速度轻量级的性质,表格的使用等等。
Lua 没有费心在其工具箱中添加正则表达式的真正原因不可能是所需代码的长度(这是废话,现代计算机在 4000 行代码时甚至不会眨眼,而“只是“ 500,即使它在库中的翻译有点不同),但可能是由于作为脚本语言的事实,假设“父”语言已经包含使用正则表达式的能力。从整体来看,很明显 Lua 作为一种语言的设计简单、快速,并且只考虑了必要的功能。它在大多数情况下运行良好,但如果您需要这方面的更多功能,而您无法使用 Lua 的其他功能复制它们,则正则表达式更为全面。
好消息是 Lua 模式和正则表达式在语法上的差异大多很小,所以如果你知道一个,你可以相对容易地适应另一个。