Lua使用特定模式

时间:2016-03-06 11:15:02

标签: lua

我需要使用特定的模式"来分割输入文件的每一行。 - "。我离解决方案不远,但我的代码实际上也拆分了单个空格。该文件的每一行格式如下:

NAME - ID - USERNAME - GROUP NAME - GROUP ID - TIMESTAMP

名称字段可以包含空格,与组名称和时间戳相同,例如像

这样的行

LUCKY STRIKE - 11223344 - @lucky - CIGARETTES SMOKERS - 44332211 - 11:42 may/5th

有效。 因此,这些标记化的值应存储在表中。 这是我的代码:

local function splitstring(inputstr)
  sep = "(%s-%s)"
  local t={} ; i=1
  for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
      t[i] = str
      i = i + 1
  end
  print("=========="..t[1].."===========")
  print("=========="..t[2].."===========")
  print("=========="..t[3].."===========")
  return t
end

当我运行它时,把"幸运"在第一场,第二场击球,第三场内的身份。 有没有办法存储"幸运罢工"在第一个字段内,仅通过指定的模式解析? 希望你们能帮助我。

P.S。我已经看过lua手册,但对我帮助不大......

2 个答案:

答案 0 :(得分:4)

这是另一种看法:

s="LUCKY STRIKE - 11223344 - @lucky - CIGARETTES SMOKERS - 44332211 - 11:42 may/5th"    
s=s.." - "
for v in s:gmatch("(.-)%s+%-%s+") do
    print("["..v.."]")
end

该模式反映了该字段的定义:直到-被空格包围的所有内容。在这里"一切"使用非贪婪模式.-实现。为了使这一工作统一,我们也将分隔符添加到结尾。使用分隔符的许多模式匹配问题可以从这种均匀性中受益。

答案 1 :(得分:2)

你有什么问题。

首先,-是Lua模式中的重复符号: http://www.lua.org/manual/5.2/manual.html#6.4.1

您需要使用%-来获取文字-

我们还没有完成:生成的gmatch调用是string.gmatch(inputstr, "[^%s%-%s]+")。由于您的分隔符模式位于[]内,因此它是一个字符类。它说“给我所有不是空间或者 - 的东西,并尽可能地贪婪”,这就是它停留在第一个空间角色的原因。

你最好的办法是做一些事情:

local function splitstring(inputstr)
  sep = "%-"
  local t={} ; i=1
  for str in string.gmatch(inputstr, "[^"..sep.."]+") do
      t[i] = str
      i = i + 1
  end
  print("=========="..t[1].."===========")
  print("=========="..t[2].."===========")
  print("=========="..t[3].."===========")
  return t
end

哪个收益率:

==========LUCKY STRIKE ===========
========== 11223344 ===========
========== @lucky ===========

......现在可以独立解决价值观周围空间的问题。