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
и /
символов.