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。