Lua使用特定模式拆分字符串

我需要使用特定模式“ - ”拆分输入文件的每一行。我离解决方案并不遥远,但我的代码实际上还拆分单个空格。文件的每一行格式如下:

名称 - ID - 用户名 - 组名 - 组ID - 时间戳

名称字段可能有空格,与组名和时间戳相同,例如像这样的行

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

当我运行它时,将“lucky”放在第一个字段,将“strike”放在第二个字段,将ID放在第三个字段中。 有没有办法仅通过指定的模式存储“lucky strike”在第一个字段中? 希望你们能帮我。

p.s. 我已经看过Lua手册,但没什么用......

点赞
用户2283319
用户2283319

有一些问题出现在你的代码当中。

首先,在 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 ===========

... 现在独立地解决值周围的空格问题。

2016-03-06 11:30:27
用户107090
用户107090

以下是另一种方法:

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

该模式反映了字段的定义:空格包围的 - 之前的所有内容。这里的“所有内容”使用非贪婪模式 .- 实现。为了使这个方法具有一致性,我们也将分隔符添加到末尾。许多使用分隔符的模式匹配问题都可以从这种一致性中获益。

2016-03-06 11:33:48