LUA сопоставление с шаблоном во вложенной таблице - PullRequest
0 голосов
/ 01 марта 2020

Я хочу сделать сопоставление с образцом в таблице ниже. Если есть совпадение, примите значения 2-го и 3-го столбца в качестве ответа. Первый столбец может иметь 1 или несколько шаблонов, строка 5 имеет только 1 шаблон для сопоставления.

local pattern_matrix = {
  {{ "^small%-", "%-small%-",         },   "small",   50},    
  {{ "^medium%-", "%-medium%-",       },   "medium",  200},    
  {{ "^big%-", "%-big%-",             },   "big",     3},    
  {{ "^large%-", "%-large%-", "^L%-", },   "large",   42},             
  {{ "%-special%-",                   },   "special", 5},
}

Я использую следующий код, чтобы найти строку, соответствующую вводу:

local function determine_row(name)
  for i = 1,#pattern_matrix,1 do
    for _,pattern in pairs(pattern_matrix[i][1]) do  --match against column 1
      if name:match(pattern) then 
        return i --match found in row i
      end
    end
  end
  return 0
end

результат должен быть

determine_row("itsamedium") = 2
determine_row("blaspecialdiscount") = 5
determine_row("nodatatomatch") = 0

1 Ответ

0 голосов
/ 02 марта 2020

Ваш код выглядит в основном правильно, но шаблон, который вы используете, немного неправильный. Вы не получаете ожидаемый индекс, потому что все шаблоны ожидают дефисы вокруг сопоставляемых слов. (из-за %- в вашем шаблоне)

Как уже упоминал Аллистер, если вы хотите сопоставить образец ввода с вашим вопросом, вы можете просто добавить это буквальное слово в свой список шаблонов. Судя по вашему использованию, вы можете даже упростить шаблон. Для поиска без учета регистра, используйте lower() или upper() на вводе перед совпадением.

Например:

<script src="https://github.com/fengari-lua/fengari-web/releases/download/v0.1.4/fengari-web.js">
</script>

<script type='application/lua'>
local pattern_matrix =
{
  { "small",   50},
  { "medium",  200},
  { "big",     3},
  { "large",   42},
  { "special", 5},
}

local function determine_row(name)
  for i, row in ipairs(pattern_matrix) do
    if name:match(row[1]) then
      return i -- match found in row i
    end
  end
  return 0
end

local test_input = { "itsa-medium-", "itsBiG no hyphen", "bla-special-discount", "nodatatomatch" }

for _, each in ipairs(test_input) do
  print( each, determine_row(each:lower())  )
end
</script>
...