Поиск определенного набора значений в строке, Lua - PullRequest
2 голосов
/ 27 июня 2019

Я пытаюсь найти строку для набора значений и вернуть значение ТОЛЬКО, если строка точно соответствует одному из набора.

Мое оригинальное выражение было таким:

title = "MrS"
setTitles = {"Miss", "Mr", "Mrs", "Dr", "Ms"}
title = (title:gsub("%w",string.lower)):gsub("^l", string.upper)

if string.match(title, setTitles) ~= nil then title = title else title = "XX" end

Затем я понял, что мне нужен какой-то способ циклического перебора значений, так что попал сюда:

title = "MrS"
setTitles = {"Miss", "Mr", "Mrs", "Dr", "Ms"}
title = (title:gsub("%w",string.lower)):gsub("^%l", string.upper)

for i = 1, 5 do
  if string.match(title, setTitles[i]) ~= nil 
    then title = title 
  else title = "XX" 
  end
end

За исключением того, что просто возвращает "XX" каждый раз.

Я знаю, что это, вероятно,довольно просто и очевидно, но я не могу найти решение и буду очень признателен за руку!

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Вы не должны изменять переменную title в цикле for.

Вы можете попробовать этот код:

--title = "MrS"
title = "MrX"
setTitles = {"Miss", "Mr", "Mrs", "Dr", "Ms"}
title = title:gsub("%w", string.lower) -- mrs
title = title:gsub("^%l", string.upper) -- Mrs

ismatch = false

for i = 1, 5 do

    print(title, setTitles[i])

    if tostring(title) == tostring(setTitles[i]) then
        ismatch = true
        print("matched")
        return
    end

end

if ismatch then title = title else title = "XX" end
print(title)

Надеюсь, это поможет.

1 голос
/ 27 июня 2019

Вот почему ваш код не работает.Ваша первая итерация цикла использует Mrs и проверяет, совпадает ли она с Miss, и это не так, меняет заголовок на XX и, следовательно, никакие последующие проверки никогда не могут совпадать.

Вы не можете изменить заголовок, пока не проверили все возможные значения.Настроив код для использования переменной matchFound, чтобы определить, требуется ли изменение, вы можете решить эту проблему:

local matchFound = false
for i = 1, 5 do
  if string.match(title, setTitles[i]) ~= nil then
    matchFound = true
    break
  end
end
if matchFound == false then
  title = "XX"
end
print(title)

Кроме того, ваш код может давать ложные совпадения для Mr, а не Mrs thisпотому что Mr будет соответствовать внутри Mrs или любой строке, которая начинается с Mr.Чтобы изменить это, вы можете настроить свой вызов string.match следующим образом:

string.match(title, "^".. setTitles[i] .. "$")

Это заставит string.match гарантировать, что первый и последний символы шаблона также являются первым и последним символами переданной строки


В качестве рекомендации вместо использования string.match сделайте свой setTitles правильный набор, например:

local setTitles = {["Miss"] = true, ["Mr"] = true, ["Mrs"] = true, ["Dr"] = true, ["Ms"] = true}

Тогда ваш чек станет:

title = setTitles[title] and title or "XX"

Ресурс Lua в наборах:

https://www.lua.org/pil/11.5.html

http://lua -users.org / wiki / SetOperations

...