• Subject: Re: gmatch problem
• From: Dirk Laurie <dirk.laurie@...>
• Date: Thu, 30 Mar 2017 15:18:51 +0200

```2017-03-30 14:43 GMT+02:00 John Logsdon <j.logsdon@quantex-research.com>:
> Folks
>
> I have a regex problem in 5.2.4 either under Cygwin or Ubuntu 16.04.
>
> I want to match two character strings like Aa, AA, A2 where the first
> letter is a capital and the second could also be a digit using
> string.gmatch to generate an iterator.
>
> If I check with string.match this works:
>
> print(string.match("blah blah Aa boo ","%u%w"))
> print(string.match("blah blah AA boo ","%u%w"))
> print(string.match("blah blah A3 boo ","%u%w"))
>
> But if I use gmatch as in a simple function:
>
> local str=" A1 blah AA boo Ax "
>
> local function getCase(A,str)
>   local nextCase = string.gmatch(str,"%u%w")
>   local N=nextCase()
>   while N ~=  nil do
>     if type(Q[N]) == 'table' then A[N] = #Q[N] end
>     N=nextCase()
>   end
>   return A
> end
>
> The function takes a table and checks whether Q[A3] for example exists and
> is a table, if so, returning the length of the table in A.

Assuming that Q is an upvalue or a global table, of course.

It works for me:

> str=" A1 blah AA boo Ax "
> Q={}
> Q.A1={1}
> Q.AA={1,2}
> Q.Ax={1,2,3}
> A={}
> getCase(A,str)
table: 0x2493710
> for k,v in pairs(A) do print(k,v) end
AA    2
A1    1
Ax    3

BTW You could code the function more compactly:

function getCase(A,str)
local nextCase = string.gmatch(str,"%u%w")
for N in nextCase do
if type(Q[N]) == 'table' then A[N] = #Q[N] end
end
return A
end

```