【问题标题】:Lua split string using specific patternLua 使用特定模式拆分字符串
【发布时间】:2016-03-06 11:15:01
【问题描述】:

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

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

name 字段可以有空格,与组名和时间戳相同,例如这样的一行

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

当我运行它时,在第一个字段中输入“幸运”,在第二个字段中输入,第三个字段中的 id。 有没有办法在第一个字段中存储“幸运罢工”,仅按指定的模式解析? 希望大家能帮帮我。

附言我已经看过 lua 手册,但对我没有太大帮助...

【问题讨论】:

  • t = {inputstr:gsub('%s+%-%s+','\0'):match(('.-(%Z+)'):rep(6))}

标签: lua


【解决方案1】:

这是另一个例子:

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

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

【讨论】:

  • 奖励积分用于解释这是如何工作的,所以 OP 不必让你为他编写他所有的 Lua 模式代码:P
  • @ChrisKitching,很公平。我已经添加了一些解释。感谢您的推动。
【解决方案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 ===========

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

【讨论】:

  • 手册中的这个页面提供了一系列关于如何从字符串末尾修剪空格的示例:lua-users.org/wiki/StringTrim
  • 看到你刚刚回复的评论了吗?
猜你喜欢
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 2010-11-28
  • 2018-06-01
  • 1970-01-01
相关资源
最近更新 更多