我试图了解Lua中string.find和string.match之间的区别。在我看来,两者都在字符串中找到了模式。但是有什么区别呢?以及如何使用它们?说,如果我有字符串“磁盘空间: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);
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经写了这个:
for Line in io.lines("/proc/meminfo") do
if Line:find("MemTotal") then
Mem = Line
Mem = string.gsub(Mem, ".*", ".*", 1)
end
end
Run Code Online (Sandbox Code Playgroud)
但这显然是错误的。我没有得到什么?我了解为什么错了,它实际上在做什么以及为什么在什么时候做
print(Mem)
Run Code Online (Sandbox Code Playgroud)
它返回
.*
Run Code Online (Sandbox Code Playgroud)
但我不知道什么是正确的方法。正则表达式使我感到困惑!
在您的情况下,您需要 string.match:
local space = tonumber(("Disk Space 3000 kB"):match("Disk Space ([%.,%d]+) kB"))
Run Code Online (Sandbox Code Playgroud)
string.find 略有不同,在返回任何捕获之前,它返回找到的子字符串的开始和结束索引。当不存在捕获时, string.match 将返回匹配的整个字符串,而 string.find 不会返回超过第二个返回值的任何内容。string.find 还允许您使用 'plain' 参数在不知道 Lua 模式的情况下搜索字符串。
当你想要匹配的捕获时使用 string.match,当你想要子字符串的位置时使用 string.find,或者当你想要位置和捕获时使用。