string.match слишком широк, есть ли другие альтернативы, которые будут работать лучше? - PullRequest
0 голосов
/ 14 июля 2020

В настоящее время я передаю несколько строк от контроллера домашней автоматизации нашему драйверу, который я сейчас разрабатываю. Я получаю такие сообщения, как ZAA и другой код, который может быть AA, но string.match иногда будет соответствовать AA с оператором ZAA if.

Эта проблема гораздо более распространена чем только эти две струны (вероятно, около 10-15 других сходств). Я понимаю, что мог бы добавить дополнительные условия к операторам if/elseif, но наверняка существует точная версия соответствия?

Любые идеи были бы очень признательны.

Пример; Даже если строка «AA», она будет соответствовать «ZAA»

stringInput = "AA"

if string.match("ZAA", stringInput) then
    print("I matched: ZAA")
elseif string.match("AA", stringInput) then 
    print("I matched: AA")
end

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Если вы хотите точное совпадение , просто используйте ==.

if stringInput == 'ZAA' then
    print('I matched: ZAA')
elseif stringInput == 'AA' then
    print('I matched: AA')
end
0 голосов
/ 15 июля 2020

Из Lua 5.3. Справочное руководство: string.match

string.match (s, pattern [, init]) Ищет первое совпадение с шаблоном (см. §6.4.1) в строке s. Если он его находит, то match возвращает захваченные данные из шаблона; в противном случае возвращается ноль. Если шаблон не указывает захватов, то возвращается все совпадение. Третий необязательный аргумент numeri c init указывает, с чего начать поиск; его значение по умолчанию равно 1 и может быть отрицательным.

поэтому

local inputString = "AA"
string.match("ZAA", inputString)

будет соответствовать, потому что "AA" находится в "ZAA".

Вы перепутали аргументы функции s и pattern.

local inputString = "AA" inputString: match ("ZAA")

не будет соответствовать, потому что шаблон содержит больше символов, чем inputString.

Но поскольку

local inputString = "ZAA"

будут соответствовать

inputString:match("AA") и inputString:match("ZAA"), вам, вероятно, придется добавить больше ограничений.

Пожалуйста, прочтите руководство!

...