Взаимодействие между диапазонами и классами не определено.
Очевидно, что это не жесткое и быстрое правило (для наборов символов регулярных выражений в целом), а решение по реализации Lua. Хотя использование сокращенных символов в наборах символов / диапазонах работает в некоторых (большинстве) разновидностях регулярных выражений, это не во всех (как в модуле re Python, demo ).
Однако второй пример вводит в заблуждение:
Следовательно, шаблоны типа [% a-z] или [a - %%] не имеют значения.
Хотя с первым примером все в порядке, поскольку %a
является сокращенным классом (который представляет все буквы) в set
, [%a-z]
не определен и вернет nil
в случае совпадения со строкой.
Экранированные символы в диапазоне [set]
Во втором примере [a-%%]
, %%
просто определяет экранированный знак%, а не класс сокращенных символов. Поверхностная проблема заключается в том, что диапазон определен с повышением , от high до low (по отношению к US ASCII значению символов a
61 и %
37 ), например, как ошибочный шаблон Lua, такой как [f-a]
. Если набор определен в обратном порядке, он , кажется, работает : [%%-a]
, но все, что он делает, - это сопоставление трех отдельных символов вместо диапазона символов от %
до a
; кредит велосипедист ).
Это может считаться ошибкой и, действительно, означает, что невозможно создать диапазон символов в [set]
, если необходимо экранировать один из определяющих символов диапазона.
Возможное решение
Начните диапазон символов со следующего символа, который не нужно экранировать, а затем добавьте остальные экранированные символы по отдельности, например,
[%%&-a]
Sample
for w in string.gmatch("%&*()-0Aa", "[%%&-a]") do
print(w)
end
Это ответ, который я нашел. Тем не менее, может быть, у кого-то есть что-то лучше.