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