Каково различие между string.find и string.match в Lua?

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

это возвращается

.*

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

5
задан OddCore 15 July 2010 в 10:09
поделиться

1 ответ

В вашем случае вы хотите, чтобы 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, если вам нужна позиция подстроки или когда вы хотите и позицию, и захваты.

4
ответ дан 15 December 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: