我试图了解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)
它返回
.*
但我不明白什么是正确的方法。正则表达式让我感到困惑!
答案 0 :(得分:4)
在您的情况下,您需要string.match:
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。