Ваша строка id, r, g, b = v.match(v, "%$color(%d+)%:%s+rgba%((%d+)%,%s+(%d+)%,%s+(%d+)%,%s+%d+%)%;") or 0, 0, 0, 0
анализируется Lua как
id = v:match(pattern) or 0
r = 0
g = 0
b = 0
Так как есть совпадение, переменная id
установлена на значение группы захвата 1, остальным присваиваются нули .
Вы можете исправить это назначение, используя таблицы:
result = {string.match(v, "%$color(%d+):%s+rgba%((%d+),%s+(%d+),%s+(%d+),%s+%d+%);")}
id, r, g, b = result[1] or 0, result[2] or 0, result[3] or 0, result[4] or 0
См. Lua demo .
ПРИМЕЧАНИЕ : ;
и ,
не являются специальными символами Lua, поэтому я удалил экранированные символы %
перед ними в шаблоне.