Lua string.match () проблема - PullRequest
       14

Lua string.match () проблема

2 голосов
/ 05 июня 2011

Я хочу сопоставить несколько строк для строки и нескольких чисел. Линии могут выглядеть как

"  Code                                             : 75.570 "

или

"  ..dll                                   :          13.559       1"

или

"  ..node                                    :  4.435    1.833    5461"

или

"  ..NavRegions                                     :  0.000         "

Я хочу что-то вроде

local name, numberLeft, numberCenter, numberRight = line:match("regex");

Но я очень новичок в сопоставлении строк.

Ответы [ 4 ]

5 голосов
/ 05 июня 2011

Этот шаблон будет работать для каждого случая:

%s*([%w%.]+)%s*:%s*([%d%.]+)%s*([%d%.]*)%s*([%d%.]*)

Краткое объяснение: [] создает набор символов (например, десятичные дроби). Последние числа используют [set]*, поэтому допустимо и пустое совпадение. Таким образом, номер, который не был найден, будет эффективно назначен nil.

Обратите внимание на разницу между использованием + - * в шаблонах. Подробнее о шаблонах в справочнике Lua .

Это будет соответствовать любой комбинации точек и десятичных знаков, поэтому может быть полезно попытаться преобразовать ее в число с tonumber() впоследствии.

Некоторые тестовые коды:

s={
"  Code                                             : 75.570 ",
"  ..dll                                   :          13.559       1",
"  ..node                                    :  4.435    1.833    5461",
"  ..NavRegions                                     :  0.000         "
}
for k,v in pairs(s) do
    print(v:match('%s*([%w%.]+)%s*:%s*([%d%.]+)%s*([%d%.]*)%s*([%d%.]*)'))
end
1 голос
/ 05 июня 2011

@ Ihf Спасибо, теперь у меня есть рабочее решение.

local moduleInfo, name = {};
for word in line:gmatch("%S+") do
    if (word~=":") then
        word = word:gsub(":", "");
        local number = tonumber(word);
        if (number) then
            moduleInfo[#moduleInfo+1] = number;
        else
            if (name) then
                name = name.." "..word:gsub("%$", "");
            else
                name = word:gsub("%$", "");
            end
        end
    end
end

@ jpjacobs Очень мило, спасибо тоже. Я перепишу свой код по синтетическим причинам ;-) Я, конечно, реализую ваше регулярное выражение.

1 голос
/ 05 июня 2011

Вот отправная точка:

s="  ..dll                                   :          13.559       1"
for w in s:gmatch("%S+") do
        print(w)
end

Конечно, вы можете сохранить эти слова в таблице вместо печати.И пропустить второе слово.

0 голосов
/ 05 июня 2011

У меня нет понимания языка Lua, поэтому я не буду вам там помогать. Но в Java это регулярное выражение должно соответствовать вашему вводу

"([a-z]*)\\s+:\\s+([\\.\\d]*)?\\s+([\\.\\d]*)?\\s+([\\.\\d]*)?"

Вы должны проверить каждую группу, чтобы узнать, есть ли данные слева, по центру, справа

Если посмотреть на Lua , это может выглядеть так. Нет гарантии, я не видел, как избежать . (точка), которая имеет особое значение, а также нет, если ? можно использовать в Lua.

"([a-z]*)%s+:%s+([%.%d]*)?%s+([%.%d]*)?%s+([%.%d]*)?"

...