Iterators and Generic For
Gmatch Numbers
Pattern iterators can extract numeric text before converting it.
matched text
`gmatch` yields strings, so numeric matches should be converted before arithmetic.
Gmatch Numbers
gmatch_numbers.lua
Replay: real traced execution (multi-file project)
local text = "a10 b20"
local total = 0
local lastNumber = 0
for digits in string.gmatch(text, "%d+") do
local number = tonumber(digits)
total = total + number
lastNumber = number
end
print("text=" .. text)
print("total=" .. total)
print("lastNumber=" .. lastNumber)
local text = "x3 y7"
local total = 0
local lastNumber = 0
for digits in string.gmatch(text, "%d+") do
local number = tonumber(digits)
total = total + number
lastNumber = number
end
print("text=" .. text)
print("total=" .. total)
print("lastNumber=" .. lastNumber)
local text = "p5 q8"
local total = 0
local lastNumber = 0
for digits in string.gmatch(text, "%d+") do
local number = tonumber(digits)
total = total + number
lastNumber = number
end
print("text=" .. text)
print("total=" .. total)
print("lastNumber=" .. lastNumber)
text ← a10 b20, total ← 0, lastNumber ← 0
1local text→ a10 b20 = "a10 b20" --@text="x3 y7", "p5 q8"2local total→ 0 = 03local lastNumber→ 0 = 0number ← 10, total ← 10, lastNumber ← 10
pass 1 of 25for digits10 in string.gmatch(texta10 b20, "%d+") do6 local number→ 10 = tonumber(digits10)7 total→ 10 = total + number108 lastNumber→ 10 = number109endnumber ← 20, total ← 30, lastNumber ← 20
pass 2 of 25for digits20 in string.gmatch(texta10 b20, "%d+") do6 local number→ 20 = tonumber(digits20)7 total→ 30 = total + number208 lastNumber→ 20 = number209endprint("text=" .. text)
11print("text=" .. texta10 b20)12print("total=" .. total30)13print("lastNumber=" .. lastNumber20)outputtext=a10 b20 total=30 lastNumber=20
text ← x3 y7, total ← 0, lastNumber ← 0
1local text→ x3 y7 = "x3 y7"2local total→ 0 = 03local lastNumber→ 0 = 0number ← 3, total ← 3, lastNumber ← 3
pass 1 of 25for digits3 in string.gmatch(textx3 y7, "%d+") do6 local number→ 3 = tonumber(digits3)7 total→ 3 = total + number38 lastNumber→ 3 = number39endnumber ← 7, total ← 10, lastNumber ← 7
pass 2 of 25for digits7 in string.gmatch(textx3 y7, "%d+") do6 local number→ 7 = tonumber(digits7)7 total→ 10 = total + number78 lastNumber→ 7 = number79endprint("text=" .. text)
11print("text=" .. textx3 y7)12print("total=" .. total10)13print("lastNumber=" .. lastNumber7)outputtext=x3 y7 total=10 lastNumber=7
text ← p5 q8, total ← 0, lastNumber ← 0
1local text→ p5 q8 = "p5 q8"2local total→ 0 = 03local lastNumber→ 0 = 0number ← 5, total ← 5, lastNumber ← 5
pass 1 of 25for digits5 in string.gmatch(textp5 q8, "%d+") do6 local number→ 5 = tonumber(digits5)7 total→ 5 = total + number58 lastNumber→ 5 = number59endnumber ← 8, total ← 13, lastNumber ← 8
pass 2 of 25for digits8 in string.gmatch(textp5 q8, "%d+") do6 local number→ 8 = tonumber(digits8)7 total→ 13 = total + number88 lastNumber→ 8 = number89endprint("text=" .. text)
11print("text=" .. textp5 q8)12print("total=" .. total13)13print("lastNumber=" .. lastNumber8)outputtext=p5 q8 total=13 lastNumber=8