Почему это возвращает тот же индекс?
Я хочу запустить две разные строки Луа найти на одной строке " (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
-- (, )