Lua:字符串后的模式匹配



例如,我有以下格式的任意行:

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

或者类似的东西。

在上启用日志

我希望能够从第一行中提取"C:\Program Files\ab\def\"部分。同样,我想在第二行中提取"开"。变量及其值之间的空格是任意的。我会知道变量的名称,但我需要在此基础上提取值。

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

假设"word"的意思是"一个没有空格的字符串",您可以这样做:

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

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

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

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

如果可以保证参数前面只有一个单词,并且该单词不包含任何空格,则可以读取该行,对其运行split函数,并根据需要使用返回数组的1索引值。

您也可以进行错误检查,并确保在预期目录中获得一个"C:\",或者检查以确保字符串==为"On"或"Off"。由于使用了硬编码的索引值,我真的建议您错误地检查您的期望值。没有什么比假设值错误更糟糕的了。

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

这可能会发现错误,可能是输入的字符串不正确。

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

line = "directory C:Program Filesabcdef/";
contents = line.split(" "); --Split using a space
directory = contents[2]; --Here is your directory
if(errorCheckDir(directory))
--Use directory
end

编辑:作为对下面评论的回应,Lua确实在1开始索引,而不是0。此外,如果目录包含空格(这很可能),而不是简单地使用content[2],我会循环浏览除索引1之外的所有内容,并将目录拼凑在一起,确保在附加的每个索引之间添加所需的空格。

因此,在上述情况下,必须将内容[2]和内容[3]缝合在一起,并在两者之间留出一个空间,以恢复正确的目录。

directory=contents[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

最新更新