在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\\", "[\\/]$", "")
尽管仍然缺少模式的逻辑“或”。
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与正则表达式不同,并且没有替代概念。
例如,如果您想从字符串的末尾删除"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
Lua正则表达式是...异常。据我从文档中了解到的那样,不支持一般的交替,也不支持将重复运算符应用于组。就您的情况而言,就像您说的那样,您可以使用字符类来获得所需的内容(不过,我不确定字符类中的逗号在做什么)。
参见此处:http://www.lua.org/manual/5.1/manual.html#5.4.1
(因此,在我以前从事的项目中,我们编写了与PCRE的Lua绑定。)