Lua中string.find和string.match有什么区别?

6
我将尝试帮助你理解Lua中的string.find和string.match的区别,它们都用于在字符串中查找模式。但是它们之间的区别是什么?我该如何使用它们?例如,如果我有一个字符串“Disk Space: 3000 kB”,我想从中提取出“3000”。
编辑:好的,我想我过于复杂化了问题,现在有点迷失了。基本上,我需要将这段Perl代码翻译成Lua:
my $mem;
my $memfree;
open(FILE, 'proc/meminfo');
while (<FILE>)
{
    if (m/MemTotal/)
    {
        $mem = $_;
        $mem =~ s/.*:(.*)/$1/;
    }
    elseif (m/MemFree/)
    {
        $memfree = $_;
        $memfree =~ s/.*:(.*)/$1/;
    }
}
close(FILE);

到目前为止,我已经写了这个:

for Line in io.lines("/proc/meminfo") do
    if Line:find("MemTotal") then
        Mem = Line
        Mem = string.gsub(Mem, ".*", ".*", 1)
    end
end

但这显然是错误的。我哪里没理解?我知道它为什么是错的,以及当我执行时它实际上在做什么和为什么

print(Mem)

它返回

.*

但是我不知道正确的方法是什么。正则表达式让我感到困惑!

1个回答

5
在您的情况下,您需要使用string.match:
local space = tonumber(("Disk Space 3000 kB"):match("Disk Space ([%.,%d]+) kB"))

string.find与string.match略有不同,它在返回任何捕获之前会返回找到的子字符串的起始和结束索引。当没有捕获时,string.match将返回匹配的整个字符串,而string.find仅不会返回第二个返回值之后的任何内容。使用“plain”参数,string.find还可以让您在不了解Lua模式的情况下搜索字符串。

当您想要匹配的捕获时,请使用string.match,当您想要子字符串的位置或同时想要位置和捕获时,请使用string.find。


好的,谢谢,我现在明白了。在我的教科书中定义为:string.find(主串, 模式串, 可选起始位置, 可选普通模式标记)据我理解,可选起始位置是我们希望搜索开始的位置,而不是返回我们正在寻找的模式的位置的输出变量。还是说它是?否则,我只是没有注意到我的教科书示例中有一个位置被返回,并且我很抱歉。 - OddCore
起始位置参数指定在字符串中开始搜索的位置。您可以在string.match和string.find中使用它。 - jA_cOp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接