我正在寻找有关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
但是,当我尝试添加额外的文本时,运行此代码时,编译器错误显示为“预期数量,得到了字符串”:
if string.match(a.message, "efs.test", "efs") then
print(a.message)
else
print ("Does not match")
end
任何指针都很棒!
谢谢。
答案 0 :(得分: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
-我想有2个文件名,严格来说,文件名只能包含%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 。然后,在空格字符之后,我们尝试匹配%1
(捕获的文件名)后跟.gpg
。由于它也被括在方括号中,因此它将成为第二个捕获的组并作为第二个变量返回。完成!
PS:您可能想通过不区分大小写的[Gg] [Pp] [Gg]模式获取“ .gpg”。
PPS:文件名可能包含空格,破折号,UTF-8字符等。 ext4仅禁止使用\0
和/
字符。
答案 1 :(得分: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.*")
答案 2 :(得分: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用来匹配带有某些例外情况的字符串的语言。