用Lua匹配整个文本行

时间:2019-01-23 16:12:27

标签: string lua match

我正在寻找有关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

任何指针都很棒!

谢谢。

3 个答案:

答案 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.*")

For reference

答案 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用来匹配带有某些例外情况的字符串的语言。