2017-01-08 5 views
0

Я хочу запустить две разные строки Lua найти на той же строке " (55)"Почему это возвращает тот же самый индекс?

Pattern 1 "[^%w_](%d+)", должно соответствовать любое число

Pattern 2 "[%(|%)|%%|%+|%=|%-|%{%|%}|%,|%:|%*|%^]", должны соответствовать любому из этих () % + = - { } , : * ^ символов.

Оба эти шаблона возвращают 2, почему? Также, если я запустил совпадение строк, они возвращают ( и 55 уважительно (как и ожидалось).

+0

Я никогда не использовал Lua, но вы говорите [^% вес _] (% D +) должно соответствовать любое число, но разве это не соответствует ни одному нон алфавитно-цифровых символов или подчеркивания «('и затем сопоставить любой номер? Итак' (55 'было бы совпадением? – Diesel

+0

Ваш второй шаблон соответствует только '' '' '' '' '' '' '' '' '' и '' '' '' '' '' цифры - возможно, вы хотите использовать шаблон границы, '"% f [% w _]% d + "'? –

ответ

0

Кажется, вы используете шаблоны с 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 
-- (,)