【问题标题】:What is the difference between string.find and string.match in Lua?Lua 中的 string.find 和 string.match 有什么区别?
【发布时间】:2010-07-15 09:13:00
【问题描述】:

我试图了解 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);

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

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

但这显然是错误的。我没有得到什么?我明白为什么它是错误的,它实际上在做什么以及为什么我这样做

print(Mem)

返回

.*

但我不明白什么是正确的方法。正则表达式让我很困惑!

【问题讨论】:

    标签: string lua


    【解决方案1】:

    在你的情况下,你想要 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,或者当你想要位置和捕获时。

    【讨论】:

    • 好的,谢谢,我明白了。在我的教科书中,它定义了 string.find(主题字符串、模式字符串、可选的起始位置、可选的普通标志)。据我了解,可选开始位置是我们可能希望搜索开始的位置,而不是返回我们正在寻找的模式位置的输出变量。或者是吗?因为否则我只是没有注意到在我的教科书示例中返回了一个位置,我道歉。
    • 开始位置参数指定在字符串中的哪个位置开始搜索。您可以将它用于 string.match 和 string.find。
    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2013-08-28
    • 2020-05-05
    • 2019-08-02
    • 2017-07-21
    相关资源
    最近更新 更多