Шаблоны Lua - почему пользовательский набор '[+ -_]' соответствует буквенно-цифровым символам?

Сегодня я играл с некоторыми шаблонами, чтобы попытаться сопоставить некоторые определенные символы в строке, и наткнулся на что-то необычное, что, надеюсь, кто-то сможет объяснить.

Я создал набор для поиска списка символов в некоторых строках и заметил, что получаю неожиданные результаты. Я исключил персонажей из набора, пока не остановился до трех, и, похоже, именно эти трое ответственны:

string = "alpha.5dc1704B40bc7f.beta.123456789.gamma.987654321.delta.abc123ABC321"

result = ""
for a in string.gmatch(string, '[+-_]') do 
result = result .. a .. " "
end

> print(result)
. 5 1 7 0 4 B 4 0 7 . . 1 2 3 4 5 6 7 8 9 . . 9 8 7 6 5 4 3 2 1 . . 1 2 3 A B C 3 2 1

Почему здесь возвращаются эти символы (выглядит как любая цифра или заглавная буква плюс точки)? Замечу, что если я изменю порядок набора, я не получу тот же результат - '[_+-]', '[-_+]', '[+_-]' или '[-+_]', все ничего не вернут, как и ожидалось.

Что такого '[+-_]', что здесь вызывает совпадение? Я не могу понять, что я говорю lua, что интерпретируется как инструкции для сопоставления этих символов.


person NNLocke    schedule 08.12.2019    source источник


Ответы (1)


Когда - находится между другими символами в квадратных скобках, это означает все, что находится между этими двумя. Например, [a-z] - это все строчные буквы, а [A-F] - это A, B, C, D, E и F. [+-_] означает каждый символ ASCII между + и _, который включает все числа, все прописные буквы и много знаков препинания.

person Joseph Sible-Reinstate Monica    schedule 08.12.2019