2010-08-11 48 views
8

在Lua中可以实现吗?逻辑'或'在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\\", "[\\,/]$", "") 

虽然逻辑“或”的模式,至今下落不明。

回答

6

Lua中没有使用标准的正则表达式模式匹配。 Programming in Lua一书的引用解释了原因:

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

但是,现有的正则表达式库和高级的LPeg库有许多绑定。有关链接的列表,请参见http://lua-users.org/wiki/LibrariesAndBindings,章节Text processing。请参阅此问题:Lua pattern matching vs. regular expressions

0

Lua正则表达式是...异常。据我可以从文档中看出,不支持一般的变更,也不支持将重复操作符应用于组。就你而言,就你所说,你可以通过角色类获得你想要的东西(虽然我不确定逗号在你的角色类中做了什么)。

在这里看到:http://www.lua.org/manual/5.1/manual.html#5.4.1

(在我曾经工作在一个项目上,我们写了,因为这是我们自己的Lua结合PCRE)

3

的Lua pattern matching是不一样的正则表达式,并没有交替的概念。

例如,如果你想从一个字符串的结尾(类似于正则表达式)除去​​或"efg"下面的代码将工作做好:

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