2

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

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

或类似的东西。

启用日志

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

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

4

3 回答 3

4

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

for line in ioFile:lines() do
  local variable, value = line:match("(%S+)%s+(.+)")
  ... --Do stuff with variable and value
end
于 2012-08-21T19:46:11.543 回答
0

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则为空字符串。

于 2012-08-22T09:32:30.063 回答
-1

我不相信 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 下面的评论,确实从 1 开始索引,而不是 0。此外,如果目录包含空格(可能)而不是简单地使用内容 [2],我将遍历除索引之外的所有内容1,然后将目录拼凑在一起,确保在附加的每个索引之间添加所需的空间。

所以在上面的例子中,contents[2] 和 contents[3] 必须被缝合在一起,中间有一个空格来恢复正确的目录。

目录 = 内容[2].." "..内容[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
于 2012-08-21T19:57:31.770 回答