Кажется, вы используете шаблоны с string.find
, который находит первое вхождение шаблона в переданную строку. Если экземпляр шаблона найден, возвращается пара значений, представляющих начало и конец строки. Если шаблон не найден, возвращается nil
.
Обе модели найти матч на позиции 2: [^%w_](%d+)
находит (
, потому что сочетается с [^%w_]
(полукокса, кроме буквы, цифры или _
) и [%(|%)|%%|%+|%=|%-|%{%|%}|%,|%:|%*|%^]
соответствует (
, потому что она является частью набора символов ,
Однако первый шаблон может быть переписан с использованием пограничной узора, %f[%w_]%d+
, который будет соответствовать 1+ цифре, если не предшествует буквы, цифра или знак подчеркивания, а вторая модель не требует такого тяжелого вытекания, [()%%+={},:*^-]
достаточно (только %
нуждается в экранировании здесь, так как -
помещается в конце набора символов и поэтому рассматривается как буквальный дефис).
Смотреть это Lua demo:
a = " (55)"
for word in string.gmatch(a, "%f[%w_]%d+") do print(word) end
-- 55
for word in string.gmatch(a, "[()%%+={},:*^-]+") do print(word) end
-- (,)
Я никогда не использовал Lua, но вы говорите [^% вес _] (% D +) должно соответствовать любое число, но разве это не соответствует ни одному нон алфавитно-цифровых символов или подчеркивания «('и затем сопоставить любой номер? Итак' (55 'было бы совпадением? – Diesel
Ваш второй шаблон соответствует только '' '' '' '' '' '' '' '' '' и '' '' '' '' '' цифры - возможно, вы хотите использовать шаблон границы, '"% f [% w _]% d + "'? –