Включить пустые совпадения при использовании string.gmatch для разделения строки в lua 5.1 - PullRequest
2 голосов
/ 06 апреля 2020

У меня есть строка ввода через запятую, которая должна поддерживать пустые записи. Таким образом, строка типа a,b,c,,d должна привести к таблице с 5 записями, где 4 - пустое значение.

Упрощенный пример

str="a,b,c,,d"
count=0

for v in string.gmatch(str, '([^,]*)') do
    count = count + 1
end

print(count)

Этот код выводит

9

в Lua 5.1, хотя есть только 5 записей.

Я могу изменить * в regex to + - тогда он сообщает 4 записи a,b,c,d, но не пустую. Кажется, это поведение было исправлено в Lua 5.2, потому что приведенный выше код прекрасно работает в lua 5.2, но я вынужден найти решение для lua 5.1

Моя текущая реализация

function getValues(inputString)
  local result = {}

  for v in string.gmatch(inputString, '([^,]*)') do
    table.insert(result, v)
  end

  return result
end

Есть предложения по исправлению?

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

Вы можете добавить запятую к тексту и захватить все значения, используя шаблон ([^,]*),:

function getValues(inputString)
  local result = {}

  for v in string.gmatch(inputString..",", '([^,]*),') do
    table.insert(result, v)
  end

  return result
end

Вывод:

a
b
c

d
0 голосов
/ 06 апреля 2020
local str="a,b,c,,d"
local count=1
for value in string.gmatch(str, ',') do
    count = count + 1
end
print(count)

И если вы хотите получить значения, вы можете сделать что-то вроде


local function values(str, previous)
    previous = previous or 1
    if previous <= #str then
        local comma = str:find(",", previous) or #str+1
        return str:sub(previous, comma-1), values(str, comma+1)
    end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...