15 Ноя 2014 в 00:41
Попробую.
Регулярное выражение - это по сути те же шаблоны как в JMC, только "на стероидах".
Все знают что например %1 сказал%2 вам: "%3" - это образец, который сработает и на Кархарот сказал вам: "привет!", и на Мелиан сказала вам: "Сюрпрайз!".
Соответственно выделенные зеленым части - это статический текст и ничего интересного.
А выделенные синим части - это совпадения чего угодно.
Регулярные выражения позволяют задать не просто совпадения _чего угодно_, а задать более точные условия для совпадения.
Давай начнем с простого примера, тот же самый триггер на телл в виде регулярного выражения выглядит вот как:
(.*) сказал(.*) вам: "(.*)"
. означает "любой символ"
* означает "предыдущее может повториться от 0 до скольких угодно раз"
+ означает "предыдущее может повторяться от 1 до скольких угодно раз".
? означает "предыдущее может повторяться от 0 до 1 раза".
получается, что .* - это любой символ от нуля до сколько угодно раз, т.е. полный аналог "чего угодно" в jmc
скобки () означают, что всё, что совпадет внутри скобок, будет записано в переменную: %0, %1, %2 и т.п.
Про скобки, поясню.
Например, если предыдущую регулярку изменить на такую:
(.*) сказал.* вам: "(.*)"
То для фразы
Мелиан сказала вам: "Сюрпрайз!"
%0 будет равно Мелиан
%1 будет равно Сюрпрайз!
т.е. буква а в переменные не попадет.
Дальше интереснее.
Что, если мы четко хотим задать некоторые варианты совпадений.
Например, явно же может быть либо "сказал", либо "сказала".
Вот как это записывается регуляркой:
(.*) (сказал|сказала) вам: "(.*)"
Т.е. варианты указываются через |.
Но обрати внимание, мне пришлось использовать скобки для определения вариантов.
Поэтому в переменные попадет вот что:
%0 будет равно Мелиан
%1 будет равно сказала
%2 будет равно Сюрпрайз!
Но как сделать так, чтобы "сказал" и "сказала" не попадали в переменную %1?
Для этого вместо простых скобок, нужно использовать хитрые скобки со знаком вопроса и двоеточием, вот так: (?:вариант1|вариант2|вариант3).
Т.е. получается вот что:
(.*) (?:сказал|сказала) вам: "(.*)"
Почти последняя фишка - это квадратные скобки.
Как я уже говорил, точка . означает любую букву или спецсимвол.
Но также можно задать для совпадения список разрешенных символов, для этого как раз квадратные скобки и нужны.
Например,
([А-Яа-я]+) (?:сказал|сказала) вам: "(.*)"
Означает, что имя того, кто тебе теляет, должно состоять из букв А до Я и от а до я, чтобы триггер сработал. А если в имени будут пробелы - пробела внутри квадратных скобок нету, значит и триггер не сработает.
Получается, что такой триггер сработает на
Мелиан сказала вам: "Сюрпрайз!"
, но не сработает например на
Зеленый чемодан сказал вам: "бугага"
потому что в "Зеленый чемодан" есть пробел.
Точно также например вот на такую штуку оно тоже не сработает:
Злодей сказал "Омлин сказал вам: "привет""
и т.д.
Ну и ^ --- это знак начала строки. Т.е. ^Вы хотите есть --- уже не сработает на Омлин сказал: "Вы хотите есть."
Вот вкратце как-то так.
Есть еще несколько тонкостей.
Например, поскольку в регулярках куча специальных символов, то что делать если нужно использовать какой-нибудь специальный символ как часть строки? Ответ - поставить перед ним бэкслэш \
Например, если хочешь чтобы теллы типа Кто-то сказал вам: "привет" тоже срабатывали, нужно поменять регулярку вот как:
([А-Яа-я\-]+) (?:сказал|сказала) вам: "(.*)"
Т.е. я добавил дефис в список допустимых символов для совпадения.
Если бы я написал ([А-Яа-я-]+), то триггер бы не сработал, потому что такое выражение неправильное, а с бэкслешем работает нормально.
Очень часто приходится точку, звездочку и дефис выделять с помощью бэкслеша.
Например ^Вы хотите есть\.
Вот как-то так.
Сори что не могу объяснить более понятно, это реально такая тема, которую тяжело объяснить.