题
我目前正在学习lua。关于LUA的模式匹配,我在lua.org的LUA文档中找到了以下句子:
但是,LUA中的模式匹配是一种强大的工具,并且包含一些难以与标准POSIX实现相匹配的功能。
由于我熟悉POSIX正则表达式,我想知道是否有任何常见的样本与正则表达式相比,LUA模式匹配是“更好”的 - 还是我误解了句子?如果有任何常见的例子:为什么任何模式匹配与正则表达式都更适合?
解决方案
与正则表达式相比,LUA模式匹配“更好”的常见样本是吗?
它不是特殊的例子,而是LUA模式具有比POSIX正则表达式更高的信噪比。总体设计通常是可取的,而不是特定的示例。
这是一些有助于良好设计的因素:
非常轻巧的语法,用于匹配常见字符类型,包括大写字母(
%u
),十进制数字(%d
),太空字符(%s
) 等等。任何字符类型都可以通过使用相应的大写字母来补充,因此%S
匹配任何非空间字符。引用非常简单和规律。引用字符是
%
, ,因此它总是与字符串引用的字符不同\
, ,这使LUA模式比POSIX的正则表达式更容易读取(必要时)。引用符号总是安全的,而且永远不必引用字母,因此您可以按照经验法则进行操作,而不是记住哪些符号是特殊的Metacharacters。LUA提供“捕获”,并可以返回多次捕获
match
称呼。该界面比通过副作用捕获子字样或具有一些隐藏状态要审问才能查找捕获的状态要好得多。捕获语法很简单:只需使用括号即可。卢阿有“最短比赛”
-
修饰符与“最长的比赛”一起进行*
操作员。因此s:find '%s(%S-)%.'
找到最短的非空间字符的序列,然后是空间,然后是一个点。LUA模式的表达能力与POSIX“基本”正则表达式相当,而没有交替操作员
|
. 。您放弃的是“扩展”的正则表达|
. 。如果您需要如此多的表达力,我建议一路走 LPEG 这基本上赋予您以相当合理的成本来赋予无上下文语法的力量。
其他提示
http://lua-users.org/wiki/librariesandbindings 包含功能列表,包括正则库,如果您想继续使用它们。
要回答这个问题(并注意我绝不是Lua Guru),该语言具有在嵌入式应用程序中使用的强烈传统,在该应用程序中,完整的正则发动机会不适当地增加平台上使用的代码大小,有时比所有LUA库本身都要大得多。
编辑]我刚刚在LUA的在线版本中找到了(一种学习语言的绝佳资源),其中该语言的原理之一描述:请参见下面的评论[/edit
我个人发现,匹配LUA的默认模式可满足我的大多数正则需求。你的旅费可能会改变。
好的,只是为此讨论的轻微菜鸟说明;我对此页面特别感到困惑:
因为那个说 \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的查找/替换中的正则表达式 - 不是Lua的Regex语法(Scite也使用)。
然后我重读 Lua-users Wiki:图案教程, ,并开始发表评论有关逃生角色的评论 %
, , 不是 \
在 @normanramsey的答案。因此,尝试这个:
> print("_".. c:match("[%s]*") .."_")
_ _
...确实有效。
因此,正如我最初认为Lua的“模式”是与Lua的“正则表达”不同的命令/引擎,我想是一种更好的说法:Lua的“模式” 是 LUA特定的“正则表达式”语法/引擎(换句话说,没有两个 :)
)
干杯!