Онлайн игра Адамант Адан: Хроники Средиземья
0 Пользователей и 1 Гость просматривают эту тему.
Страницы: [1]

stariкашка Шааббаа

  • Герой
  • *****
  • Сообщений: 506
  • доверяй и тебя продадут
14 Ноя 2014 в 01:02

Регулярные выражения


#action {/^([А-я]+)(?:[ \-А-я])+?(?:легонько|слегка|легко|сильно|очень сильно|чрезвычайно сильно|смертельно|БОЛЬНО|ОЧЕНЬ БОЛЬНО|НЕВЫНОСИМО БОЛЬНО|попытал(?:ась|ось|ся|ись))? ?(?:лягну|удари|ткну|рубану|резану|хлестну|уколо|оцарапа|ободра|укуси|подстрели|огре|сокруши)(?:л[аои]?|ть) (ИМЯ_1|ИМЯ_2|ИМЯ_3)/} {спасти %1;дразнить %0}
растолкуйте нуберу о регулярных
попытки самостоятельно изучить - окончились пшиком
{/ - это зачек регулярного выражения??
([А-я]- это все знаки которые будут обрабатываться???
+) - это что значит?
(?:[ \-А-я])+? - а это
(?:легонько|слегка|легко|сильно|очень сильно|чрезвычайно сильно|смертельно|БОЛЬНО|ОЧЕНЬ БОЛЬНО|НЕВЫНОСИМО БОЛЬНО| - это то что знак замены и подстановки к первой группе???
кому не лень - объясните дебилу

Объект 'большая деревянная ложка',
Наверное, вы сможете держать это в левой руке.
Флаги неудобств   : !МАГ !ВОР !ВОИН !ПАЛАДИН !СЛЕДОПЫТ !ДРУИД !ВАРВАР !РЫЦАРЬ СМЕРТИ !ЛУЧНИК  Уровень предмета  : 5
Эффекты на вас : 
HITROLL: +1
вот  на хрен это надо??
Косуля припрыгала с юга. - это лягуха шоль?

Кархарот

  • [Бессмертный]
  • Герой
  • *****
  • Сообщений: 758
15 Ноя 2014 в 00:41

Re: Регулярные выражения

Попробую.

Регулярное выражение - это по сути те же шаблоны как в JMC, только "на стероидах".

Все знают что например %1 сказал%2 вам: "%3" - это образец, который сработает и на Кархарот сказал вам: "привет!", и на Мелиан сказала вам: "Сюрпрайз!".

Соответственно выделенные зеленым части - это статический текст и ничего интересного.
А выделенные синим части - это совпадения чего угодно.
Регулярные выражения позволяют задать не просто совпадения _чего угодно_, а задать более точные условия для совпадения.

Давай начнем с простого примера, тот же самый триггер на телл в виде регулярного выражения выглядит вот как:
(.*) сказал(.*) вам: "(.*)"

. означает "любой символ"

* означает "предыдущее может повториться от 0 до скольких угодно раз"
+ означает "предыдущее может повторяться от 1 до скольких угодно раз".
? означает "предыдущее может повторяться от 0 до 1 раза".

получается, что .* - это любой символ от нуля до сколько угодно раз, т.е. полный аналог "чего угодно" в jmc

скобки () означают, что всё, что совпадет внутри скобок, будет записано в переменную: %0, %1, %2 и т.п.

Про скобки, поясню.
Например, если предыдущую регулярку изменить на такую:
(.*) сказал.* вам: "(.*)"

То для фразы
Мелиан сказала вам: "Сюрпрайз!"

%0 будет равно Мелиан
%1 будет равно Сюрпрайз!

т.е. буква а в переменные не попадет.

Дальше интереснее.

Что, если мы четко хотим задать некоторые варианты совпадений.
Например, явно же может быть либо "сказал", либо "сказала".
Вот как это записывается регуляркой:
(.*) (сказал|сказала) вам: "(.*)"

Т.е. варианты указываются через |.
Но обрати внимание, мне пришлось использовать скобки для определения вариантов.
Поэтому в переменные попадет вот что:
%0 будет равно Мелиан
%1 будет равно сказала
%2 будет равно Сюрпрайз!

Но как сделать так, чтобы "сказал" и "сказала" не попадали в переменную %1?
Для этого вместо простых скобок, нужно использовать хитрые скобки со знаком вопроса и двоеточием, вот так: (?:вариант1|вариант2|вариант3).

Т.е. получается вот что:

(.*) (?:сказал|сказала) вам: "(.*)"

Почти последняя фишка - это квадратные скобки.
Как я уже говорил, точка . означает любую букву или спецсимвол.
Но также можно задать для совпадения список разрешенных символов, для этого как раз квадратные скобки и нужны.

Например,
([А-Яа-я]+) (?:сказал|сказала) вам: "(.*)"

Означает, что имя того, кто тебе теляет, должно состоять из букв А до Я и от а до я, чтобы триггер сработал. А если в имени будут пробелы - пробела внутри квадратных скобок нету, значит и триггер не сработает.

Получается, что такой триггер сработает на
Мелиан сказала вам: "Сюрпрайз!"

, но не сработает например на
Зеленый чемодан сказал вам: "бугага"

потому что в "Зеленый чемодан" есть пробел.

Точно также например вот на такую штуку оно тоже не сработает:
Злодей сказал "Омлин сказал вам: "привет""

и т.д.

Ну и ^ --- это знак начала строки. Т.е. ^Вы хотите есть --- уже не сработает на Омлин сказал: "Вы хотите есть."


Вот вкратце как-то так.
Есть еще несколько тонкостей.
Например, поскольку в регулярках куча специальных символов, то что делать если нужно использовать какой-нибудь специальный символ как часть строки? Ответ - поставить перед ним бэкслэш \

Например, если хочешь чтобы теллы типа Кто-то сказал вам: "привет" тоже срабатывали, нужно поменять регулярку вот как:
([А-Яа-я\-]+) (?:сказал|сказала) вам: "(.*)"

Т.е. я добавил дефис в список допустимых символов для совпадения.
Если бы я написал ([А-Яа-я-]+), то триггер бы не сработал, потому что такое выражение неправильное, а с бэкслешем работает нормально.
Очень часто приходится точку, звездочку и дефис выделять с помощью бэкслеша.
Например ^Вы хотите есть\.

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

Lackros

  • [Гил Эстель]
  • Ветеран
  • *
  • Сообщений: 182
17 Ноя 2014 в 14:54

Re: Регулярные выражения

Вот тут есть клевая справка по Jmc
тем же и про регексы есть

http://www.mudconnector.su/Main/JmcTutorial#section1

Страницы: [1]