Lua模式匹配与正则expression式的比较
我目前正在学习lua。 关于lua中的模式匹配,我在lua.org的lua文档中find了以下句子:
不过,Lua中的模式匹配是一个强大的工具,并且包含了一些难以与标准POSIX实现相匹配的特性。
正如我熟悉posix正则expression式,我想知道是否有任何共同的样本,其中lua模式匹配比正则expression式“更好” – 还是我误解了句子? 如果有什么常见的例子:为什么模式匹配和正则expression式更适合?
与正则expression式相比,lua模式匹配是否“更好”的常见示例?
Lua模式比POSIX正则expression式具有更高的信噪比,这并不是特别的例子。 总体devise往往是可取的,而不是特别的例子。
以下是一些有助于优秀devise的因素:
-
用于匹配常见字符types(包括大写字母(
%u
),十进制数字(%d
),空格字符(%s
)等)的非常轻量级的语法。 任何字符types都可以使用相应的大写字母来补充,所以模式%S
匹配任何非空格字符。 -
引用是非常简单和规则的。 引用字符是
%
,所以它总是与string引用字符\
,这使得Lua模式比POSIX正则expression式(当需要引用时)更容易阅读。 引用符号总是安全的,而且没有必要引用字母,所以你可以按照经验法则而不是记住哪些符号是特殊的元字符。 -
Lua提供“捕获”,并可以通过
match
返回多个捕获。 这个界面比通过副作用捕获子串或者有一些隐藏状态必须被询问才能find捕获要好得多。 捕捉语法很简单:只需使用括号即可。 -
Lua有一个“最短匹配”
-
修饰符与“最长匹配”*
运算符一起。 例如s:find '%s(%S-)%.'
find空格前面紧跟着一个点的非空格字符的最短序列。 -
Lua模式的performance力与POSIX“基本”正则expression式相媲美,没有交替操作符
|
。 你放弃的是用“|
”扩展正则expression式 。 如果你需要这么强大的expression能力,我build议你一路LPEG ,以相当合理的成本为你提供上下文无关语法的能力。
http://lua-users.org/wiki/LibrariesAndBindings包含一系列function,包括正则expression式库,如果你想继续使用它们。;
为了回答这个问题(并且我注意到我绝不是一个Lua guru),这个语言在embedded式应用程序中有很强的传统,在这个应用程序中,一个完整的正则expression式引擎会过度地增加在这个平台上使用的代码的大小,有时远远超过了所有的Lua库本身。
[编辑]我刚在网上发现的Lua编程语言(这是学习语言的一个很好的资源),这是用语言的一个原则来描述的:请看下面的注释[/编辑]
我个人发现,默认的模式匹配Lua提供的满足我的大部分正则expression式的需求。 你的旅费可能会改变。
好吧,这个讨论只是一个轻微noob注意; 我特别被这个页面弄糊涂了:
SciTE正则expression式
因为那个说\s
匹配空白,正如我从其他正则expression式语法知道…所以我试图在一个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的查找/replace正则expression式 – 而不是Lua的正则expression式语法(这也是使用)。
然后,我重读了lua-users wiki:Patterns Tutorial ,并开始得到关于转义字符%
的评论,而不是@在@NormanRamsey的答案中。 所以,试试这个:
> print("_".. c:match("[%s]*") .."_") _ _
确实有效
所以,正如我原本以为Lua的“模式”是Lua的“正则expression式”中不同的命令/引擎,我想更好的说法是:Lua的“模式” 是特定于Lua的“正则expression式”语法/引擎换句话说,他们不是两个:)
)
干杯!