【问题标题】:Regular expressions in Lua using .gsub()Lua 中使用 .gsub() 的正则表达式
【发布时间】:2010-07-15 10:27:12
【问题描述】:

好吧,我想我把事情复杂化了,现在我迷路了。基本上,我需要把它从 Perl 翻译成 Lua:

my $mem;
my $memfree;
open(FILE, 'proc/meminfo');
while (<FILE>)
{
    if (m/MemTotal/)
    {
        $mem = $_;
        $mem =~ 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)

返回

.*

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

【问题讨论】:

    标签: regex string lua gsub


    【解决方案1】:

    下面的代码解析该文件的内容并将其放在一个表中:

    meminfo={}
    for Line in io.lines("/proc/meminfo") do
        local k,v=Line:match("(.-): *(%d+)")
        if k~=nil and v~=nil then meminfo[k]=tonumber(v) end
    end
    

    你可以这样做

    print(meminfo.MemTotal)
    

    【讨论】:

    • 这是一个更好、更完整的解决方案。
    【解决方案2】:

    Lua 不使用正则表达式。请参阅 Programming in Lua,20.1 和后续部分,了解 Lua 中模式匹配和替换的工作原理以及它与正则表达式的不同之处。

    在您的情况下,您将完整的字符串 (.*) 替换为文字字符串 .* - 您得到的只是 .* 返回也就不足为奇了。

    原来的正则表达式用冒号后面的部分替换了任何包含冒号 (.*:(.*)) 的东西,所以 Lua 中的类似语句可能是

    string.gsub(Mem, ".*:(.*)", "%1")
    

    【讨论】:

    • 好的,谢谢。现在有点道理,我只是觉得我永远无法完全理解正则表达式。
    • 捕获组 ((.*)) 是不必要的。 string.gsub(Mem, ".*:", "") 就够了。它会删除最后一个 : 之前的所有内容。
    • @Mizard:我只是从 Perl 代码中逐字复制代码,但确实应该足够了,是的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多