Lua模式中的逻辑'或'?

时间:2010-08-11 20:09:05

标签: lua lua-patterns

是否有可能在Lua中实现?

local noSlashEnding = string.gsub("slash\\ending\\string\\", "\\|/$", "")
-- noSlashEnding should contain "slash\\ending\\string"

local noSlashEnding2 = string.gsub("slash/ending/string/", "\\|/$", "")
-- noSlashEnding2 should contain "slash/ending/string"

这里的要点是在Lua模式中不接受逻辑'或'语句。


编辑: 刚刚意识到这可以做到这一点:

strng.gsub("slash\\ending\\string\\", "[\\,/]$", "")

虽然模式的逻辑'或'仍然缺失。

3 个答案:

答案 0 :(得分:7)

Lua不使用标准正则表达式进行模式匹配。书中引用Programming in Lua解释了原因:

  

与其他几种脚本语言不同,Lua不使用POSIX正则表达式(regexp)进行模式匹配。主要原因是尺寸:POSIX regexp的典型实现需要超过4,000行代码。这比所有Lua标准库一样大。相比之下,Lua中模式匹配的实现少于500行。当然,Lua中的模式匹配不能完全完成POSIX实现。然而,Lua中的模式匹配是一个强大的工具,包括一些难以与标准POSIX实现匹配的功能。

但是,对现有正则表达式库以及高级LPeg库有许多绑定。有关带链接的列表,请参阅http://lua-users.org/wiki/LibrariesAndBindings,章Text processing

另请参阅此问题:Lua pattern matching vs. regular expressions

答案 1 :(得分:5)

Lua pattern matching与正则表达式不同,并且没有替换概念。

例如,如果您想从字符串末尾删除"abc""efg"(类似于"(abc|efg)$"正则表达式),则以下代码可以正常运行:

local inputstring="123efgabc"
local s,n = inputstring:gsub("abc$", "")
if n == 0 then
  s,n = inputstring:gsub("efg$", "")
end
print(s) --> 123efg

答案 2 :(得分:0)

Lua正则表达式......异常。据我在文档中可以看出,不支持一般的替换,也不支持将重复操作符应用于组。在你的情况下,正如你所说,你可以通过一个角色类得到你想要的东西(我不确定逗号在你的角色类中做了什么)。

见这里:http://www.lua.org/manual/5.1/manual.html#5.4.1

(在我曾经做过的一个项目中,由于这个原因,我们写了自己的Lua绑定到PCRE。)