Совпадение всей точной текстовой строки с Lua - PullRequest
0 голосов
/ 23 января 2019

Я ищу небольшую помощь по Луа.Мне нужен код, чтобы соответствовать этой точной строке:

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 голосов
/ 25 января 2019
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: Возможно, вы захотите получить «.gpg» без учета регистра [Gg] [Pp] [Gg].

PPS: Имена файлов могут содержать пробелы, тире,UTF-8 символов и т. Д. Например, ext4 запрещает только \0 и / символов.

0 голосов
/ 26 января 2019

Если вы пытаетесь сопоставить эту точную линию, ее проще использовать:

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 использовал для сопоставления строк с некоторыми исключениями.

0 голосов
/ 24 января 2019

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

Для справки

...