【问题标题】:Lua: Pattern match after a string?Lua:字符串后的模式匹配?
【发布时间】:2012-08-21 19:36:16
【问题描述】:

例如,我有这种格式的任意行:

目录 C:\Program Files\abc\def\

或类似的东西。

启用日志

我希望能够从第一行中提取“C:\Program Files\ab\def\”部分。同样,我想在第二行中提取“开”。变量和它的值之间的空格是任意的。我会知道变量的名称,但我需要根据它提取值。

所以基本上,我想删除第一个单词和第一个单词后面的任意空格,并返回直到行尾的剩余内容。

【问题讨论】:

  • 顺便说一句:您有很多问题,但答案也不少。您可能需要仔细阅读它们并在适当的情况下接受其中的一些。

标签: lua lua-patterns


【解决方案1】:

假设“单词”的意思是“一串没有空格的字符”,你可以这样做:

for line in ioFile:lines() do
  local variable, value = line:match("(%S+)%s+(.+)")
  ... --Do stuff with variable and value
end

【讨论】:

  • 嗨。我认为这应该有效。因此,如果我有该行的变量。
【解决方案2】:

Nicol Bolas 展示了string.match 的另一种选择,这是另一种选择:

function splitOnFirstSpace(input)
    local space = input:find(' ') or (#input + 1)
    return input:sub(1, space-1), input:sub(space+1)
end

用法:

local command, param = splitOnFirstSpace(line)

如果没有给出参数 (splitOnFirstSpace('no-param-here')),那么 param 是空字符串。

【讨论】:

  • 这是否适用于变量和值之间的任意数量的空格?
  • 不,不会。您需要调用input:find('%s+') 并保存空白的开始和结束位置。或者,您可以在之后修剪参数。
【解决方案3】:

我不相信 Lua 是用 Ruby 或 Perl 之类的 split() 函数打包的。

我发现这家伙构建了一个 lua 版本的 Perl 的 split 函数: http://lua-users.org/lists/lua-l/2011-02/msg01145.html

如果你能保证参数前面只有 1 个单词,并且那个单词不包含任何空格,你可以在该行中读取,在其上运行 split 函数,并使用返回数组的 1 索引值作为什么你想要的。

您也可以错误检查并确保在预期目录中获得“C:\”,或检查以确保字符串 == 到“On”或“Off”。由于使用硬编码的索引值,我真的提倡你错误检查你的期望值。没有什么比假设值错误更糟糕的了。

如果检测到错误,请务必将其记录或打印到屏幕上,以便您了解它。

这可以捕获可能输入的字符串不正确的错误。

一些简单的代码模拟了我建议你做的事情:

line = "directory C:\Program Files\abc\def/";

contents = line.split(" "); --Split using a space
directory = contents[2]; --Here is your directory

if(errorCheckDir(directory))
--Use directory
end

编辑: Lua 下面的 cmets 确实从 1 开始索引,而不是 0。 此外,如果目录包含空格(可能)而不是简单地使用内容 [2],我将遍历除索引 1 之外的所有内容,并将目录拼凑在一起,确保在每个内容之间添加所需的空间您附加的索引。

因此,在上述情况下,contents[2] 和 contents[3] 必须重新缝合在一起,中间有一个空格才能恢复正确的目录。

目录 = 内容[2].." "..contents[3]

这可以很容易地使用一个有循环并返回正确目录的函数来自动化:

function recoverDir(contents)
    directory = "";
    --Recover the directory
    for i=2, table.getn(contents) do
        directory = directory..contents[i].." ";
    end
    --strip extra space on the end
    dirEnd = string.len(directory);
    directory = string.sub(directory,1,dirEnd-1);
    return directory; --proper directory
end

【讨论】:

  • 如果目录有空格怎么办,比如他的例子?
  • 不适用于空格;和 lua 表从一个索引。
  • 你们俩都完全正确。 @Nicol我可以修改上面的内容,只循环除拆分的第一个结果之外的所有内容,我们可以恢复目录名称,但这会很混乱,我会选择你的解决方案,而不是 Daurn:完全忘记了 Lua 有那个行为。感谢您指出了这一点。我将编辑以上内容以反映这些更改,以免我完全混淆人们。
猜你喜欢
  • 2021-06-07
  • 2011-03-29
  • 2018-03-11
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 2011-06-28
相关资源
最近更新 更多