【问题标题】:Lua text parsing, space handlingLua文本解析,空间处理
【发布时间】:2013-06-15 00:01:01
【问题描述】:

我是 Lua 的新手。我想解析文本像

Phase1:A B Phase2:A B Phase3:W O R D Phase4:WORD

Phase1         Phase2      Phase3     Phase4

A              A B         W O R D    WORD

我用string.gmatch(s, "(%w+):(%w+)"),只能得到

Phase1     Phase2     Phase3       Phase4

A          A          W            WORD

我怎样才能找回丢失的 B、O、R、D?
还是我需要为每个阶段编写模式?该怎么做?

【问题讨论】:

  • for k, v in s:gsub('%s*(%w+:)','\0%1'):gmatch'%z(%w+):(%Z*)'
  • @Egor Skriptunoff 的解决方案效果很好。但我不知道如何将他的建议添加为答案。你能解释一下什么是'\0%1''%z'函数吗?我不明白。

标签: regex parsing text lua


【解决方案1】:

您示例中的输入文本在短语之间没有任何明确的分隔符,因此使用正则表达式准确解析它很棘手。

如果您添加像, 这样的分隔符来分隔短语,这将更容易解析。

Phrase1:A B, Phrase2:A B, Phrase3:W O R D,Phrase4:WORD

然后你可以用这个模式解析它:

s = "Phrase1:A B, Phrase2:A B, Phrase3:W O R D,Phrase4:WORD"

for k, v in s:gmatch "(Phrase%d+):([^,]+)" do
    print(k, v)
end

输出:

Phrase1 A B
Phrase2 A B
Phrase3 W O R D
Phrase4 WORD

如果不能放宽上面的约束,你可以试试这个模式:

  s:gmatch "Phrase%d+:%w[%w ]* "

请注意,此模式有一个警告,您要解析的字符串末尾需要有一个额外的空格,否则最后一个短语将不会被解析。

【讨论】:

  • 谢谢。文本来自机器日志。所以我不能给它们都加逗号。真正的文本更没有条理,比如 --- aperture:2.8 ProcessSpeed:High throughput BrightLevel:123.12。我不能使用“短语”作为标识符。测试名称是一个单词,但结果可能是几个单词。
【解决方案2】:
for k, v in s:gsub('%s*(%w+:)','\0%1'):gmatch'%z(%w+):(%Z*)'

– @Egor Skriptunoff
这种模式效果更好。

【讨论】:

  • 我在修改greatwolf的答案时无法解析小数。所以@Egor Skriptunoff 的解决方案是我问题的唯一正确答案。请在我的问题下方的评论中投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多