В чем разница между string.find и string.match в Lua? - PullRequest
5 голосов
/ 15 июля 2010

Я пытаюсь понять, в чем разница между string.find и string.match в Lua.Мне кажется, что оба находят образец в строке.Но в чем разница?И как я могу использовать каждый?Скажем, если бы у меня была строка «Дисковое пространство: 3000 кБ», и я хотел извлечь из нее «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)

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

.*

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

1 Ответ

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

В вашем случае вы хотите string.match:

local space = tonumber(("Disk Space 3000 kB"):match("Disk Space ([%.,%d]+) kB"))

string.find немного отличается тем, что перед возвратом любых захватов возвращает начальный и конечный индексы найденной подстроки. Когда нет никаких захватов, string.match вернет всю найденную строку, в то время как string.find просто не вернет ничего после второго возвращаемого значения. Кроме того, string.find позволяет искать строку, не зная о шаблонах Lua, используя параметр plain.

Используйте string.match, когда вы хотите совпавшие захваты, и string.find, когда вы хотите положение подстроки или когда вы хотите и позицию, и захваты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...