Строка токенизации (старая) Lua - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь токенизировать предложение NMEA, используя Lua. Текущая версия Lua (доступна на https://www.lua.org/cgi-bin/demo) работает должным образом:

local index = 0
for token in string.gmatch("$HEHDT,99.00,,T*2F", "[%w.]*") do
 print(string.format("%d: %s", index, token))
 index = index + 1
end

, что дает:

0: 
1: HEHDT
2: 99.00
3: 
4: T
5: 2F
Your program ran successfully.

Однако с использованием Lua 5.1 .4 (и 5.2.4 в Wireshark)

0:
1: HEHDT
2:
3: 99.00
4:
5:
6: T
7:
8: 2F
9:

Есть ли способ получить тот же вывод токенизации, используя более старый Lua, как и в текущей версии?

Ответы [ 2 ]

2 голосов
/ 05 марта 2020
local index = 0
local str = "$HEHDT,99.00,,T*2F"
for token in string.gmatch(str.."$", "([%w.]*)[^%w.]") do
   print(string.format("%d: %s", index, token))
   index = index + 1
end
0 голосов
/ 05 марта 2020

Кажется, Lua обнаруживает пустую строку между двумя токенами как отдельный токен по любой причине. Это не интуитивно понятно, но не совсем неверно, поскольку [%w]* соответствует пустой строке. Вы можете обойти эту проблему, используя string.find и увеличивая позицию на два вместо одного после каждого совпадения:

local index = 0
local str = "$HEHDT,99.00,,T*2F"

local a, b = 0, 1
while true do
  a, b = str:find("[%w.]*", b+2)
  if not a then break end
  print(string.format("%d: [%i,%i] %s", index, a, b, str:sub(a, b)))
  index = index + 1
end

Этот код, вероятно, может быть переписан, чтобы быть немного красивее, но я оставлю что тебе: D

...