RegExp & Lua patterns
RegExp & Lua patterns
Хотел по быстрому разобрать результат 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=""
Баг?
попробовал:
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 ··· ·· -- ··· ··-
-
- Posts: 6839
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: RegExp & Lua
Да, баг. Причём, если убрать ^, то начинает работать правильно.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=""
Баг?
Наверное, на мантис.
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Spring — внедрение Lua в качестве макроязыка
key="/RCtrlRAlt(.+)/";
Сделать бы доступным в макросе результат разбора регэкспа.
Вероятно нужна функция возвращающая строку по номеру группы.
Сделать бы доступным в макросе результат разбора регэкспа.
Вероятно нужна функция возвращающая строку по номеру группы.
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Spring — внедрение Lua в качестве макроязыка
С ним всё в порядке, просто хочется чтобы полученные группы (содержимое скобок) были доступны внутри макроса.
Например сейчас разбор клавиши ("CtrlAltNum2") примерно так
А хочется как-то так:
Например сейчас разбор клавиши ("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]
-
- Posts: 6839
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: Spring — внедрение Lua в качестве макроязыка
Идею понял, беру на заметку.
Однако парсинг можно сделать гораздо проще:
Однако парсинг можно сделать гораздо проще:
Code: Select all
local prefix,key = akey(1):match("(.+)(Num%d)")Â
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Spring — внедрение Lua в качестве макроязыка
Действительно просто, спасибо.
P.S.
P.P.S.
http://bugs.farmanager.com/view.php?id=2310
P.S.
Если будет, то очень желательно и в conditionShmuel wrote:Идею понял, беру на заметку.
P.P.S.
http://bugs.farmanager.com/view.php?id=2310
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: RegExp & Lua
А всё-таки возможно ли красиво решить задачу стандартными средствами Lua?SUSim wrote:Хотел по быстрому разобрать результат mf.waitkey() на составляющие Ctrl, Alt, Shift, Char
...всё равно nil, ладно, в Lua никто и не обещал, что можно пропускать скобкиCode: Select all
Key="CtrlShiftG" local Ctrl,Alt,Shift,Char = Key:match("^(R?Ctrl)?(R?Alt)?(Shift)?(.*)$")
-
- Posts: 6839
- Joined: Thu 23 Mar, 2006 21:36
- Location: Israel
- Has thanked: 41 times
- Been thanked: 530 times
Re: RegExp & Lua
Смотря что считать стандартными средствами. Паттерны в Lua заметно уступают по возможностям регулярным выражениям Perl'а. И неудивительно, библиотека PCRE, например, по объёму кода превышает Lua со всеми его библиотеками. Но ту же PCRE легко пристегнуть к Lua.
Естественно, данную задачу можно решить на чистом 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)?(.+)?")Â
Lua pattern
Как написать в Lua pattern эквивалентный с regex /^(?:\s*(\w+))+/. Проблема в том, что Lua не позволяет "(xxx)+" (repeating groups).
Я хочу написать pattern, которий например для "abc def ghi(xxx) zzz" возвращает "ghi". Я думаю, что это необходимо сделать процедурально .
Я хочу написать pattern, которий например для "abc def ghi(xxx) zzz" возвращает "ghi". Я думаю, что это необходимо сделать процедурально .
Re: Lua pattern
Спасибо, уже работает. И кде это в документации? Например не возвращает table, а string.
Code: Select all
local m = regex.match(value, "^([\\s\\.]*(\\w+))+")
- John Doe
- Бюрократ
- Posts: 13861
- Joined: Wed 27 Apr, 2005 20:42
- Has thanked: 74 times
- Been thanked: 428 times
- Contact:
Re: Lua pattern
luafar_manual.chm::/272.html
Code: Select all
...
Returns:
c1,... : strings (there can be false in place of captures
not participated in the match)