15

是否有可能在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\\", "[\\/]$", "")

尽管仍然缺少模式的逻辑“或”。

4

3 回答 3

13

Lua 不使用标准正则表达式进行模式匹配。《 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 模式匹配与正则表达式

于 2010-08-13T09:57:36.637 回答
9

Lua模式匹配和正则表达式不一样,没有交替的概念。

例如,如果您想从字符串的末尾删除"abc"or "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
于 2010-08-11T23:07:52.490 回答
1

Lua 正则表达式是……不正常的。据我从文档中可以看出,不支持一般交替,也不支持将重复运算符应用于组。在您的情况下,正如您所说,您可以通过字符类获得所需的内容(不过,我不确定逗号在您的字符类中做了什么)。

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

(在我曾经从事的一个项目中,我们编写了自己的 Lua 绑定到 PCRE。)

于 2010-08-11T22:17:55.280 回答