Lua模式匹配与正则表达式

aur*_*ora 62 regex lua lua-patterns

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

然而,Lua中的模式匹配是一个强大的工具,包括一些难以与标准POSIX实现匹配的功能.

由于我熟悉posix正则表达式,我想知道是否有任何常见的样本,其中lua模式匹配与正则表达式相比"更好" - 或者我是否误解了句子?如果有任何常见的例子:为什么模式匹配与正则表达式中的任何一个更适合?

Nor*_*sey 67

与正则表达式相比,lua模式匹配是否"更好"?

Lua模式具有比POSIX正则表达式更高的信噪比,这并不是特别的例子.总体设计通常是优选的,而不是特定的例子.

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

  • 用于匹配常见字符类型的非常轻量级语法,包括大写字母(%u),十进制数字(%d),空格字符(%s)等.可以使用相应的大写字母来补充任何字符类型,因此模式%S匹配任何非空格字符.

  • 引用非常简单和有规律.引号字符是%,所以它总是不同于字符串引用字符\,这使得Lua模式比POSIX正则表达式更容易阅读(当需要引用时).引用符号总是安全的,并且永远不必引用字母,因此您可以按照经验法则而不是记住哪些符号是特殊的元字符.

  • Lua提供"捕获",并且可以通过match呼叫返回多个捕获.这个界面比通过副作用捕获子串或者有一些必须被查询以找到捕获的隐藏状态要好得多.捕获语法很简单:只需使用括号.

  • Lua有一个"最短匹配" -修饰符,与"最长匹配" *运算符一起使用.因此,例如,s:find '%s(%S-)%.'找到以空格开头并且后跟一个点的非空间字符的最短序列.

  • Lua模式的表达能力与POSIX"基本"正则表达式相当,没有交替运算符|.你放弃的是"扩展"正则表达式|.如果你需要那么强大的表达能力,我建议一直到LPEG,它基本上以非常合理的成本提供无上下文语法的强大功能.

  • "最短匹配"修饰符与PCRE"节俭匹配"运算符"*?"不一样吗?? (4认同)
  • 还有一个'%bxy`匹配一对平衡的分隔符,例如括号或大括号.无法在POSIX正则表达式中完成平衡括号匹配.此外,在Lua 5.1中存在前沿模式但未记录,并且在5.2中成为记录的特征.[wiki说](http://lua-users.org/wiki/FrontierPattern)"前缀模式`%f`后跟一个集合检测到从"未设置"到"设置中"的转换"此操作是在regexp中可能但更冗长. (4认同)

Kei*_*mel 7

http://lua-users.org/wiki/LibrariesAndBindings包含一系列功能,包括正则表达式库,如果您希望继续使用它们.

为了回答这个问题(并注意到我不是Lua大师),该语言在嵌入式应用程序中有着强大的传统,其中完整的正则表达式引擎会过度增加平台上使用的代码的大小. ,有时比Lua图书馆本身的大得多.

[编辑]我刚刚在Lua编程的在线版本(学习语言的优秀资源)中找到了这一点,这是由该语言的原理之一描述的:见下面的评论[/ Edit]

我个人认为,与Lua匹配的默认模式满足了我的大部分正则表达式需求.你的旅费可能会改变.