Pattern iterators can extract numeric text before converting it.

matched text `gmatch` yields strings, so numeric matches should be converted before arithmetic.

Gmatch Numbers

text
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)
  1. text ← a10 b20, total ← 0, lastNumber ← 0

    1local text→ a10 b20 = "a10 b20" --@text="x3 y7", "p5 q8"2local total→ 0 = 03local lastNumber→ 0 = 0
  2. number ← 10, total ← 10, lastNumber ← 10

    pass 1 of 2
    5for digits10 in string.gmatch(texta10 b20, "%d+") do6  local number→ 10 = tonumber(digits10)7  total→ 10 = total + number108  lastNumber→ 10 = number109end
  3. number ← 20, total ← 30, lastNumber ← 20

    pass 2 of 2
    5for digits20 in string.gmatch(texta10 b20, "%d+") do6  local number→ 20 = tonumber(digits20)7  total→ 30 = total + number208  lastNumber→ 20 = number209end
  4. print("text=" .. text)

    11print("text=" .. texta10 b20)12print("total=" .. total30)13print("lastNumber=" .. lastNumber20)
    outputtext=a10 b20
    total=30
    lastNumber=20
  1. text ← x3 y7, total ← 0, lastNumber ← 0

    1local text→ x3 y7 = "x3 y7"2local total→ 0 = 03local lastNumber→ 0 = 0
  2. number ← 3, total ← 3, lastNumber ← 3

    pass 1 of 2
    5for digits3 in string.gmatch(textx3 y7, "%d+") do6  local number→ 3 = tonumber(digits3)7  total→ 3 = total + number38  lastNumber→ 3 = number39end
  3. number ← 7, total ← 10, lastNumber ← 7

    pass 2 of 2
    5for digits7 in string.gmatch(textx3 y7, "%d+") do6  local number→ 7 = tonumber(digits7)7  total→ 10 = total + number78  lastNumber→ 7 = number79end
  4. print("text=" .. text)

    11print("text=" .. textx3 y7)12print("total=" .. total10)13print("lastNumber=" .. lastNumber7)
    outputtext=x3 y7
    total=10
    lastNumber=7
  1. text ← p5 q8, total ← 0, lastNumber ← 0

    1local text→ p5 q8 = "p5 q8"2local total→ 0 = 03local lastNumber→ 0 = 0
  2. number ← 5, total ← 5, lastNumber ← 5

    pass 1 of 2
    5for digits5 in string.gmatch(textp5 q8, "%d+") do6  local number→ 5 = tonumber(digits5)7  total→ 5 = total + number58  lastNumber→ 5 = number59end
  3. number ← 8, total ← 13, lastNumber ← 8

    pass 2 of 2
    5for digits8 in string.gmatch(textp5 q8, "%d+") do6  local number→ 8 = tonumber(digits8)7  total→ 13 = total + number88  lastNumber→ 8 = number89end
  4. print("text=" .. text)

    11print("text=" .. textp5 q8)12print("total=" .. total13)13print("lastNumber=" .. lastNumber8)
    outputtext=p5 q8
    total=13
    lastNumber=8