RegExp & Lua patterns

Здесь обсуждается всё, что касается макросов.
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

RegExp & Lua patterns

Post by SUSim »

Хотел по быстрому разобрать результат mf.waitkey() на составляющие Ctrl, Alt, Shift, Char
попробовал:
Key="CtrlAltShiftG" local Ctrl,Alt,Shift,Char = Key:match("^(R?Ctrl)(R?Alt)(Shift)(.*)$")
всё отлично Ctrl=="Ctrl", Alt=="Alt", Shift=="Shift", Char=="G"
но при
Key="CtrlShiftG" local Ctrl,Alt,Shift,Char = Key:match("^(R?Ctrl)(R?Alt)(Shift)(.*)$")
получил nil, попробовал
Key="CtrlShiftG" local Ctrl,Alt,Shift,Char = Key:match("^(R?Ctrl)?(R?Alt)?(Shift)?(.*)$")
всё равно nil, ладно, в Lua никто и не обещал, что можно пропускать скобки, но есть ведь мощный regex:
Key="CtrlShiftG" local Ctrl,Alt,Shift,Char = regex.match(Key,"^(R?Ctrl)?(R?Alt)?(Shift)?(.*)$")
и вот тут засада Ctrl=="Ctrl", Alt=="ShiftG", Shift=="Shift", Char=="G", это с чего вдруг? Я бы понял если Alt был бы не nil (как хотелось), а Alt=="" как в стандартно замене фара: $2=""
Баг?
SimSU ··· ·· -- ··· ··-
Shmuel
Posts: 6839
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Re: RegExp & Lua

Post by Shmuel »

SUSim wrote:Key="CtrlShiftG" local Ctrl,Alt,Shift,Char = regex.match(Key,"^(R?Ctrl)?(R?Alt)?(Shift)?(.*)$")
и вот тут засада Ctrl=="Ctrl", Alt=="ShiftG", Shift=="Shift", Char=="G", это с чего вдруг? Я бы понял если Alt был бы не nil (как хотелось), а Alt=="" как в стандартно замене фара: $2=""
Баг?
Да, баг. Причём, если убрать ^, то начинает работать правильно.
Наверное, на мантис.
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Re: RegExp & Lua

Post by SUSim »

SimSU ··· ·· -- ··· ··-
User avatar
SUSim
Posts: 1637
Joined: Thu 18 Feb, 2010 17:32
Has thanked: 9 times
Been thanked: 26 times

Re: RegExp & Lua

Post by SUSim »

Работает :)
SimSU ··· ·· -- ··· ··-
User avatar
John Doe
Бюрократ
Posts: 13861
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: Spring — внедрение Lua в качестве макроязыка

Post by John Doe »

key="/RCtrlRAlt(.+)/";
Сделать бы доступным в макросе результат разбора регэкспа.
Вероятно нужна функция возвращающая строку по номеру группы.
Shmuel
Posts: 6839
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Spring — внедрение Lua в качестве макроязыка

Post by Shmuel »

John Doe wrote:key="/RCtrlRAlt(.+)/";
А что с этим key не в порядке? У меня работает.
User avatar
John Doe
Бюрократ
Posts: 13861
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: Spring — внедрение Lua в качестве макроязыка

Post by John Doe »

С ним всё в порядке, просто хочется чтобы полученные группы (содержимое скобок) были доступны внутри макроса.
Например сейчас разбор клавиши ("CtrlAltNum2") примерно так

Code: Select all

    key="/.+Num\\d/";
......
    local i=akey(1):find("Num%d")
    local key=akey(1):sub(i)
    local prefix=akey(1):sub(1,i-1)
А хочется как-то так:

Code: Select all

    key="/(.+)(Num\\d)/";
.......
    local key=keyRE[2]
    local prefix=keyRE[1]
Shmuel
Posts: 6839
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Re: Spring — внедрение Lua в качестве макроязыка

Post by Shmuel »

Идею понял, беру на заметку.

Однако парсинг можно сделать гораздо проще:

Code: Select all

local prefix,key = akey(1):match("(.+)(Num%d)") 
User avatar
John Doe
Бюрократ
Posts: 13861
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: Spring — внедрение Lua в качестве макроязыка

Post by John Doe »

Действительно просто, спасибо.

P.S.
Shmuel wrote:Идею понял, беру на заметку.
Если будет, то очень желательно и в condition

P.P.S.
http://bugs.farmanager.com/view.php?id=2310
User avatar
John Doe
Бюрократ
Posts: 13861
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: RegExp & Lua

Post by John Doe »

SUSim wrote:Хотел по быстрому разобрать результат mf.waitkey() на составляющие Ctrl, Alt, Shift, Char
...

Code: Select all

Key="CtrlShiftG"
local Ctrl,Alt,Shift,Char = Key:match("^(R?Ctrl)?(R?Alt)?(Shift)?(.*)$")
всё равно nil, ладно, в Lua никто и не обещал, что можно пропускать скобки
А всё-таки возможно ли красиво решить задачу стандартными средствами Lua?
Shmuel
Posts: 6839
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 530 times

Re: RegExp & Lua

Post by Shmuel »

Смотря что считать стандартными средствами. Паттерны в Lua заметно уступают по возможностям регулярным выражениям Perl'а. И неудивительно, библиотека PCRE, например, по объёму кода превышает Lua со всеми его библиотеками. Но ту же PCRE легко пристегнуть к Lua.

Естественно, данную задачу можно решить на чистом Lua, только это будет не так кратко, как с полноценными регекспами.

Code: Select all

local _,a,Ctrl  = Key:find("^(R?Ctrl)")
local _,b,Alt   = Key:find("^(R?Alt)", (a or 0)+1)
local _,c,Shift = Key:find("^(Shift)", (b or a or 0)+1)
local Char      = Key:match(".+", (c or b or a or 0)+1) 
Но поскольку у нас есть фаровские регекспы, то

Code: Select all

local Ctrl,Alt,Shift,Char = regex.match(Key, "^(R?Ctrl)?(R?Alt)?(Shift)?(.+)?") 
xarx
Posts: 125
Joined: Tue 23 Nov, 2010 12:06

Lua pattern

Post by xarx »

Как написать в Lua pattern эквивалентный с regex /^(?:\s*(\w+))+/. Проблема в том, что Lua не позволяет "(xxx)+" (repeating groups).
Я хочу написать pattern, которий например для "abc def ghi(xxx) zzz" возвращает "ghi". Я думаю, что это необходимо сделать процедурально :-(.
User avatar
John Doe
Бюрократ
Posts: 13861
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: Lua pattern

Post by John Doe »

Можно воспользоваться другими функциями LuaFAR (regex*)
xarx
Posts: 125
Joined: Tue 23 Nov, 2010 12:06

Re: Lua pattern

Post by xarx »

Спасибо, уже работает. И кде это в документации? Например

Code: Select all

local m = regex.match(value, "^([\\s\\.]*(\\w+))+")
не возвращает table, а string.
User avatar
John Doe
Бюрократ
Posts: 13861
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 74 times
Been thanked: 428 times
Contact:

Re: Lua pattern

Post by John Doe »

luafar_manual.chm::/272.html

Code: Select all

...
Returns:
  c1,...  : strings (there can be false in place of captures
                     not participated in the match)

Post Reply

Return to “Обсуждение макросов”