lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]

On 8 June 2011 09:36, Dirk Laurie <> wrote:
On Wed, Jun 08, 2011 at 09:37:15AM +0200, steve donovan wrote:
> On Wed, Jun 8, 2011 at 12:46 AM, Igor Medeiros <> wrote:
> > (systemScreen([1 .. 9])|systemAudio([1 .. 9]))
> OK, your problem is that Lua patterns do not do alternatives like
> this. So you will have to split the match into two patterns:

If you do it this way:

match = function (s,t,init)
 if type(t)=="table" then
   for _,pattern in ipairs(t) do
     if string.match(s,pattern,init) then
       return string.match(s,pattern,init)
   else return string.match(s,t,init)

then match(s,t,init) behaves like string.match, but also allows


(Actually, it would be nice if the the definition of a pattern
could be extended to allow table arguments in this way to all
string functions.  This is not a non-suggestion!)


As always in programming there are many ways of skinning a cat and personally I would not use match for this exercise as I would not want to search the string twice. I would instead use string.find looking for 'system' then find the variants anchored  at the location returned by the first find. So something like

function find_screen_or_audio(input) 
    local s,e = input.find('system')
    local s1,e1 = input:find('^screen%([1-9]%)',e)
    if s1 == nil then 
        s1,e1 = input:find('^audio%([1-9]%)',e)
    if s1 return then input:sub(input:sub(s,e1) end