Регулярные выражения в Lua с использованием .gsub () - PullRequest
2 голосов
/ 15 июля 2010

Хорошо, я думаю, что слишком усложнил вещи, и теперь я потерян.По сути, мне нужно перевести это с 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)

, он возвращает

.*

, но я не понимаю, как правильносделай это.Регулярные выражения смущают меня!

Ответы [ 2 ]

3 голосов
/ 15 июля 2010

Код ниже анализирует содержимое этого файла и помещает его в таблицу:

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)
1 голос
/ 15 июля 2010

Lua не использует регулярные выражения. См. Программирование в Lua, разделы 20.1 и далее, чтобы понять, как работает сопоставление и замена шаблонов в Lua и чем они отличаются от регулярных выражений.

В вашем случае вы заменяете полную строку (.*) на буквальную строку .* - неудивительно, что вы получаете только .* возвращенный.

Исходное регулярное выражение заменяло все, что содержало двоеточие (.*:(.*)), частью после двоеточия, поэтому подобное утверждение в Lua могло бы быть

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