我正在寻找一些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
任何指针都会很棒!
谢谢。
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
和/
字符。
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.*")
如果您尝试匹配该确切的行,则更容易使用:
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用于匹配字符串的语言,但有一些例外。