首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Lua模式匹配与正则表达式

Lua模式匹配与正则表达式
EN

Stack Overflow用户
提问于 2010-04-23 02:18:34
回答 4查看 52.1K关注 0票数 63

我目前正在学习lua。关于lua中的模式匹配,我在lua.org上的lua文档中找到了以下句子:

尽管如此,Lua中的模式匹配是一个强大的工具,并且包括一些难以与标准

实现相匹配的功能。

因为我熟悉posix正则表达式,所以我想知道是否有任何常见的示例表明lua模式匹配比正则表达式“更好”--或者我误解了这句话?如果有任何常见的例子:为什么模式匹配与正则表达式更适合?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-23 13:47:47

与正则表达式相比,

模式匹配“更好”的常见示例有吗?

这并不是什么特别的例子,因为Lua模式比POSIX正则表达式具有更高的信噪比。它的总体设计往往更可取,而不是特定的例子。

以下是一些有助于好的设计的因素:

  • 非常轻量级的语法,用于匹配常见字符类型,包括大写字母(%u)、十进制数字(%d)、空格字符(%s)等。任何字符类型都可以通过使用相应的大写字母来补充,因此模式character.
  • Quoting匹配任何非空格%S是非常简单和规则的。引号字符是%,因此它始终不同于字符串引号字符\,这使得Lua模式比POSIX正则表达式更易于阅读(当需要引号时)。引用符号总是安全的,而且永远不需要引用字母,所以您可以根据经验法则,而不是记住哪些符号是metacharacters.
  • Lua提供的特殊“捕获”,并且可以作为match调用的结果返回多个捕获。这个接口比通过副作用捕获子字符串要好得多,或者具有一些隐藏状态,必须通过询问才能找到捕获。捕获语法很简单:只需使用parentheses.
  • Lua有一个“最短匹配”-修饰符和“最长匹配”*操作符。例如,s:find '%s(%S-)%.'查找前面有空格,后面有一个点的非空格字符的最短序列。
  • 没有交替操作符|,Lua模式的表达能力与POSIX的“基本”正则表达式相当。您放弃的是|的“扩展”正则表达式。如果您需要如此强大的表达能力,我建议您使用LPEG,它以相当合理的成本为您提供了上下文无关文法的强大功能。
票数 68
EN

Stack Overflow用户

发布于 2010-04-23 02:42:43

http://lua-users.org/wiki/LibrariesAndBindings包含一个功能列表,其中包括您希望继续使用的regex库。

要回答这个问题(请注意,我绝不是Lua专家),该语言有在嵌入式应用程序中使用的强大传统,在嵌入式应用程序中,完整的正则表达式引擎会不适当地增加平台上使用的代码的大小,有时会比所有Lua库本身大得多。

我刚刚在在线版本的Lua编程(学习这门语言的一个很好的资源)中找到了/Edit,它是由该语言的一个原则描述的:请参阅下面的评论

我个人发现Lua提供的默认模式匹配满足了我的大多数regex-y需求。您的里程可能会有所不同。

票数 8
EN

Stack Overflow用户

发布于 2012-05-02 18:34:15

好的,在这个讨论中只有一个小提示;我特别被这个页面搞糊涂了:

SciTE Regular Expressions

因为我从其他正则表达式语法中了解到,\s匹配空格...所以我在一个shell中尝试它:

代码语言:javascript
复制
$ 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答案中的\

代码语言:javascript
复制
> print("_".. c:match("[%s]*") .."_")
_   _

..。确实起作用了。

因此,由于我最初认为Lua的“模式”是不同于Lua的“正则表达式”的命令/引擎,我想更好的说法是:Lua的“模式”是特定于Lua的“正则表达式”语法/引擎(换句话说,没有两个:) )。

干杯!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2693334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档