Проверка соответствия символа в заданной позиции определенному значению в Lua - PullRequest
1 голос
/ 19 июня 2019

У меня есть строка букв, YYY или NNN и т. Д., И я хочу проверить, скажем, первый символ - Y, или средний символ - Y.

Это должно происходить несколько раз по разным строкам, проверяя разные значения.

У меня есть решение, которое работает (благодаря this ):

matchCode1 = 'YYY'

function set(...)
   local ret = {}
   for _,k in ipairs({...}) do ret[k] = true end
   return ret
end

if set('YYY', 'YYN', 'YNY', 'YNN')[matchCode1] then
   print('true')
else 
  print('false')
end

Мне просто интересно, есть ли более простой способ, учитывая, что мне нужно только проверить, является ли (в данном случае) первая буква в строке Y.

matchCode1 может быть любой комбинацией Y и N, но всегда содержит 3 символа.

Другие случаи, которые я проверю, это то, что второй символ - Y, а третий - Y, а затем, если ALL - Y.

Любой совет будет приветствоваться!

1 Ответ

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

Вы можете использовать string.find.string.find возьмет шаблон Lua и найдет совпадение в заданной строке, вернет индексы символа.

В этом примере рассматривается только первый экземпляр Y:

function checkMatchCode(code)
  startIndex = code:find('Y')

  if startIndex == 1 or startIndex == 2 then
    print(code .. ': true')
  else 
    print(code .. ': false')
  end
end

checkMatchCode('YYY')
checkMatchCode('YNY')
checkMatchCode('NYY')
checkMatchCode('NYN')
checkMatchCode('NNY')
checkMatchCode('NNN')

Выходные данные:

YYY: true
YYN: true
YNY: true
NYY: true
NYN: true
NNY: false
NNN: false

Вы также можете использовать string.gmatch аналогичным образом, чтобы создать таблицу результатов вашего матча

В этом примере проверяется, есть ли каждый символ в строкеis Y:

function checkMatchCode(code)
  local results = {}

  for char in code:gmatch('.') do
    local charPosition = #results + 1
    if char == 'Y' then
      results[charPosition] = true
    else
      results[charPosition] = false
    end
  end

  if results[1] and results[2] then -- using an and here to show the difference 
    print(code .. ': true')
  else 
    print(code .. ': false')
  end
end

checkMatchCode('YYY')
checkMatchCode('YNY')
checkMatchCode('NYY')
checkMatchCode('NYN')
checkMatchCode('NNY')
checkMatchCode('NNN')

Вывод:

YYY: true
YYN: true
YNY: false
NYY: false
NYN: false
NNY: false
NNN: false

string.gmatch - более эффективный вариант, если вы хотите сопоставить несколько символов или иметь таблицу всех результатов совпадений дляв другом месте, где в вашем коде.

string.find - быстрая проверка, которая может сказать вам, если есть хотя бы 1 Y и где это Y, не имеет значения, есть ли у вас 1 или 3 Yтолько когда-либо получит информацию о первом матче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...