Lua:在字符串后执行模式匹配吗?

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

directory C:\Program Files\abc\def\

或类似的东西。

log-enabled On

我想能够从第一行中提取出 "C:\Program Files\ab\def\" 部分。同样,我想从第二行中提取出 "On" 的值。变量和其值之间的空格是任意的。我将知道变量的名称,但需要根据它来提取值。

因此,基本上,我想要移除第一个单词和随之而来的任意空格数量,并返回剩余的内容直到行末。

点赞
用户734069
用户734069

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

对于 ioFile:lines() 中的每一行 do
  local variable, value = line:match("(%S+)%s+(.+)")
  ... --使用变量和值执行任务
结束
2012-08-21 19:46:11
用户1440774
用户1440774

我不相信 Lua 自带类似于 Ruby 或 Perl 中的 split() 函数。

我发现有人在 Lua 中构建了类似于 Perl 中 split() 函数的版本: http://lua-users.org/lists/lua-l/2011-02/msg01145.html

如果你能保证参数在它之前仅有一个单词,而该单词不包含任何空格,则可以读取该行,运行 split 函数,并将返回数组的第一个索引值作为你想要的值。

你也可以进行错误检查,以确保你得到了预期目录中的“C:\”,或者检查字符串是否等于“On”或“Off”。因为使用了硬编码的索引值,我真的建议你检查一下预期的值。没有什么比假定的值错误更糟糕的了。

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

这可以捕捉到可能输入不正确的字符串等 bug。

以下为模拟我建议你采用的一些简单代码:

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

contents = line.split(" "); --使用空格分割
directory = contents[2]; --这就是你的目录

if(errorCheckDir(directory))
--使用目录
end

编辑: 根据下面的评论,Lua 的索引确实从 1 开始,而不是 0。 另外,在目录包含空格的情况下(这是很可能的),不要仅仅使用 contents[2],而是循环遍历除了索引1之外的所有 contents 索引,并将它们拼接起来,确保在每个附加索引之间添加所需的空格。

因此,在上面的情况下,contents[2] 和 contents[3] 必须使用空格拼接起来以恢复正确的目录。

directory = contents[2].." "..contents[3]

这可以很容易地在一个带有循环的函数中自动化,该函数返回正确的目录:

function recoverDir(contents)
    directory = "";
    --恢复目录
    for i=2, table.getn(contents) do
        directory = directory..contents[i].." ";
    end
    --剥离末尾的额外空格
    dirEnd = string.len(directory);
    directory = string.sub(directory,1,dirEnd-1);
    return directory; --正确的目录
end
2012-08-21 19:57:31
用户221509
用户221509

一个使用 string.match 的替代方法已经被 Nicol Bolas 展示了,下面是另一种替代方法:

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-22 09:32:30