使用Lua匹配整个精确的文本行

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

我正在寻找一些Lua的帮助。我需要一些代码来匹配这条确切的行:

efs.test efs.test.gpg

这是我到目前为止所匹配的“efs.test”:

if string.match(a.message, "%a+%a+%a+.%%a+%a+%a+%a+") then
print(a.message)

else

print ("Does not match")
end

我也试过这个,匹配:

if string.match(a.message, "efs.test") then
print(a.message)

else

print ("Does not match")
end

但是当我尝试在运行此代码时添加额外的文本时,我的编译器错误为“Number expected,got string”:

if string.match(a.message, "efs.test", "efs") then
print(a.message)

else

print ("Does not match")
end

任何指针都会很棒!

谢谢。

string lua match
3个回答
3
投票
if string.match(a.message, "%a+%a+%a+.%%a+%a+%a+%a+") then

首先,这是量词的错误用法。来自PiL 20.2

+ 1次或更多次重复

*重复0次或更多次

- 也是0次或更多次重复

?可选(0或1次出现)

换句话说,在已经将完整单词与无限%a +匹配后,您尝试匹配无限%a +


为了匹配efs.test efs.test.gpg - 我认为我们有两个文件名,严格来说文件名可能只包含%w - 字母数字字符(A-Za-z0-9)。这将正确匹配efs.test

string.match(message, "%w+%.%w+")

更进一步,将efs.test作为文件名和以下文件名匹配:

string.match(message, "%w+%.%w+ %w+%.%w+%.gpg")

虽然这会匹配两个文件名,但您需要检查匹配的文件名是否相同。我们可以更进一步:

local file, gpgfile = string.match(message, "(%w+%.%w+) (%1%.gpg)")

此模式将返回文件名相同的任何<filename> <filename>.gpg

通过使用捕获组,我们捕获文件名:它将作为第一个变量返回,并进一步表示为%1。然后在空格char之后,我们尝试匹配%1(捕获的文件名),然后是.gpg。由于它也括在括号中,它将成为第二个被捕获的组并作为第二个变量返回。完成!

PS:您可能希望通过不区分大小写的[Gg] [Pp] [Gg]模式获取“.gpg”。

PPS:文件名可以包含空格,短划线,UTF-8字符等。 ext4只禁止\0/字符。


1
投票

string.match可选的第三个参数是开始搜索的给定字符串的索引。如果你正在寻找具有给定间距的那个顺序的efs.test efs.test.gpg,为什么不使用:

string.match(a.message, "efs%.test efs%.test%.gpg")

如果要匹配包含该子字符串的整行:

string.match(a.message, ".*efs%.test efs%.test%.gpg.*")

For reference


0
投票

如果您尝试匹配该确切的行,则更容易使用:

if "efs.test efs.test.gpg" = a.message then
    print(a.message)
else
    print("string does not match!")
end

当然,这不会找到任何其他字符串。我在你的问题中看到的另一种解释是,你想知道它是否在字符串中有efs.test,你应该能够通过这样做来完成:

if string.match(a.message, "%w+%.%w+") == "efs.test" then
    ...
end

另外,看看正则表达式,它基本上是Lua用于匹配字符串的语言,但有一些例外。

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