Почему это возвращает тот же индекс?

Я хочу запустить две разные строки Луа найти на одной строке " (55)"

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

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

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

1 ответ

Кажется, вы используете шаблоны с string.findкоторый находит первое вхождение шаблона в передаваемой строке. Если экземпляр шаблона найден, возвращается пара значений, представляющих начало и конец строки. Если образец не может быть найден nil возвращается

Оба паттерна находят совпадение в позиции 2: [^%w_](%d+) находки ( потому что это соответствует [^%w_] (символ, отличный от буквы, цифры или _), а также [%(|%)|%%|%+|%=|%-|%{%|%}|%,|%:|%*|%^] соответствует ( потому что это часть набора символов.

Тем не менее, первый шаблон может быть переписан с использованием шаблона границы, %f[%w_]%d+, которая будет соответствовать 1+ цифрам, если ей не предшествуют буквы, цифры или подчеркивание, а второй шаблон не требует такого тяжелого экранирования, [()%%+={},:*^-] достаточно (только % здесь нужно убежать, так как - помещается в конце набора символов и, таким образом, рассматривается как буквальный дефис).

Посмотрите это демо Lua:

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
-- (, )
Другие вопросы по тегам