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

What is the difference between string.find and string.match in Lua?

我试图了解Lua中string.find和string.match之间的区别。对我来说,似乎两者都在字符串中找到了一个模式。但是有什么区别呢?以及我该如何使用它们?说,如果我有字符串"磁盘空间:3000 kB",而我想从中提取" 3000"。

编辑:好的,我想我把事情复杂化了,现在我迷路了。基本上,我需要将其从Perl转换为Lua:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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);

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

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

但这显然是错误的。我没有得到什么?我了解为什么错了,它实际上在做什么以及为什么我什么时候做

1
print(Mem)

返回

1
.*

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


在您的情况下,您需要string.match:

1
local space = tonumber(("Disk Space 3000 kB"):match("Disk Space ([%.,%d]+) kB"))

string.find稍有不同,在返回任何捕获之前,它返回找到的子字符串的开始和结束索引。如果没有捕获,string.match将返回匹配的整个字符串,而string.find只会返回第二个返回值之后的任何内容。 string.find还允许您通过使用'plain'参数来搜索字符串而无需了解Lua模式。

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