Lua模式中的逻辑'或'?

问题描述 投票:13回答:3

在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 lua-patterns
3个回答
11
投票

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

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

但是,现有的正则表达式库和高级的LPeg库都有很多绑定。有关带有链接的列表,请参见http://lua-users.org/wiki/LibrariesAndBindingsText processing章。

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


7
投票

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

0
投票

Lua正则表达式是...异常。据我从文档中了解到的那样,不支持一般的交替,也不支持将重复运算符应用于组。就您的情况而言,就像您说的那样,您可以使用字符类来获得所需的内容(不过,我不确定字符类中的逗号在做什么)。

参见此处:http://www.lua.org/manual/5.1/manual.html#5.4.1

(因此,在我以前从事的项目中,我们编写了与PCRE的Lua绑定。)

© www.soinside.com 2019 - 2024. All rights reserved.