我目前正在学习lua。关于lua中的模式匹配,我在lua.org上的lua文档中找到了以下句子:
尽管如此,Lua中的模式匹配是一个强大的工具,并且包括一些难以与标准
实现相匹配的功能。
因为我熟悉posix正则表达式,所以我想知道是否有任何常见的示例表明lua模式匹配比正则表达式“更好”--或者我误解了这句话?如果有任何常见的例子:为什么模式匹配与正则表达式更适合?
发布于 2010-04-23 13:47:47
与正则表达式相比,
模式匹配“更好”的常见示例有吗?
这并不是什么特别的例子,因为Lua模式比POSIX正则表达式具有更高的信噪比。它的总体设计往往更可取,而不是特定的例子。
以下是一些有助于好的设计的因素:
%u
)、十进制数字(%d
)、空格字符(%s
)等。任何字符类型都可以通过使用相应的大写字母来补充,因此模式character.%S
是非常简单和规则的。引号字符是%
,因此它始终不同于字符串引号字符\
,这使得Lua模式比POSIX正则表达式更易于阅读(当需要引号时)。引用符号总是安全的,而且永远不需要引用字母,所以您可以根据经验法则,而不是记住哪些符号是metacharacters.match
调用的结果返回多个捕获。这个接口比通过副作用捕获子字符串要好得多,或者具有一些隐藏状态,必须通过询问才能找到捕获。捕获语法很简单:只需使用parentheses.-
修饰符和“最长匹配”*
操作符。例如,s:find '%s(%S-)%.'
查找前面有空格,后面有一个点的非空格字符的最短序列。|
,Lua模式的表达能力与POSIX的“基本”正则表达式相当。您放弃的是|
的“扩展”正则表达式。如果您需要如此强大的表达能力,我建议您使用LPEG,它以相当合理的成本为您提供了上下文无关文法的强大功能。发布于 2010-04-23 02:42:43
http://lua-users.org/wiki/LibrariesAndBindings包含一个功能列表,其中包括您希望继续使用的regex库。
要回答这个问题(请注意,我绝不是Lua专家),该语言有在嵌入式应用程序中使用的强大传统,在嵌入式应用程序中,完整的正则表达式引擎会不适当地增加平台上使用的代码的大小,有时会比所有Lua库本身大得多。
我刚刚在在线版本的Lua编程(学习这门语言的一个很好的资源)中找到了/Edit,它是由该语言的一个原则描述的:请参阅下面的评论
我个人发现Lua提供的默认模式匹配满足了我的大多数regex-y需求。您的里程可能会有所不同。
发布于 2012-05-02 18:34:15
好的,在这个讨论中只有一个小提示;我特别被这个页面搞糊涂了:
因为我从其他正则表达式语法中了解到,\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的Find/Replace中的正则表达式-而不是Lua的regex语法(scite也使用该语法)。
然后我重读了lua-users wiki: Patterns Tutorial,并开始得到关于转义字符是%
的注释,而不是@NormanRamsey答案中的\
。
> print("_".. c:match("[%s]*") .."_")
_ _
..。确实起作用了。
因此,由于我最初认为Lua的“模式”是不同于Lua的“正则表达式”的命令/引擎,我想更好的说法是:Lua的“模式”是特定于Lua的“正则表达式”语法/引擎(换句话说,没有两个:)
)。
干杯!
https://stackoverflow.com/questions/2693334
复制相似问题