Lua string.match проблема? - PullRequest
       19

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

1 голос
/ 28 августа 2011

как мне сопоставить следующие строки с одним выражением?

local a = "[a 1.001523] <1.7 | [...]> <? 0?>";

local b = "[b 2.68] <..>";

local c = "[b 2.68] <>";

local d = "[b 2.68] <> <> <?>";

локальное имя, netTime, аргумент1, аргумент2, аргументX = строка: совпадение (?);

- (строка a или b или c или d)

Проблема в том, что строки могут иметь различное количество аргументов ("<...>"), а аргументы могут содержать числа, символы, специальные символы или пробелы. Я новичок в Lua, и мне нужно научиться сопоставлять строки, но я не могу выучить это за несколько часов. Я прошу ВАС, потому что завтра мне нужен результат, и я очень признателен за вашу помощь!

ура :) 1017 *

Ответы [ 2 ]

1 голос
/ 29 августа 2011

Паттерны Lua действительно ограничены, но вы можете обойтись, если сделаете некоторые предположения.Например, если в аргументах нет символов>, вы можете просто зациклить все подходящие пары <>:

local a = "[a 1.001523] <1.7 | [...]> < a123 > < ? 0 ?>"
local b = "[b 2.68] <..>"
local c = "[b 2.68] <>"
local d = "[b 2.68] <> < > < ?>"

function parse(str)
    local name,nettime,lastPos = str:match'%[(%a+)%s(%d+%.%d+)%]()'
    local arguments={}
    -- start looking for arguments only after the initial part in [ ] 
    for argument in str:sub(lastPos+1):gmatch('(%b<>)') do
        argument=argument:sub(2,-2) -- strip <>
        -- do whatever you need with the argument. Here we'll just put it in a table
        arguments[#arguments+1]=argument
    end
    return name,nettime,unpack(arguments)
end

. Для более сложных вещей лучше использовать что-то вроде LPEG, как сказал Капеп.

1 голос
/ 28 августа 2011

Шаблоны Lua очень ограничены, у вас не может быть альтернативных выражений и дополнительных групп. Таким образом, это означает, что все ваши аргументы должны быть сопоставлены с одинаковыми выражениями, и вам нужно будет использовать фиксированное количество аргументов, если вы пишете только один шаблон. Посмотрите этот учебник , это не займет много времени, чтобы привыкнуть к шаблонам lua.

Возможно, вы по-прежнему сможете анализировать эти строки, используя несколько шаблонов. ^%[(%a+)%s(%d+%.%d+)%]%s - лучшее, что вы можете сделать, чтобы получить первую часть, при условии, что локальное имя может иметь несколько заглавных и строчных букв. Чтобы сопоставить аргументы, запустите несколько шаблонов для частей ввода, например <%s*> или <(%w+)>, чтобы проверить каждый аргумент отдельно.

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

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