PDA

Просмотр полной версии : вопрос по $.lastMatchN


masterspirta
06.11.2007, 17:35
Я немного не понял как использовать эту команду
(.*) \(.*

\(.* <-- зачем это нужна?
или можна так....
Player (.*) is casting Extremity Fist on you


єто правильно?
consol /.*/
do pm "$.lastpm" $.lastMatchN

Gans
06.11.2007, 18:21
флуд!

(.*) \(.*
это нарисованы сиськи, хорошая команда

4epT
06.11.2007, 18:49
masterspirta, $.lastMatchN тут вовсе не при чём, "(.*) \(.*" - это regexp (регулярное выражение, шаблон)

тут вроде как-то описано (http://ragbot.ru/forum/showpost.php?p=6117&postcount=21)

По экспериментируй и ты поймёшь что это ;)

masterspirta
06.11.2007, 19:04
я читал там....
И норм читал и там написано что
языке Perl сочетание .* означает - любое число любых символов.
Я хочу знать если мне надо вытянуть допустим ник как показано в примере
то на его месте мне надо поставить именно эту комбинацию --> (.*) \(.*
А переменная $.lastMatchN принимает значение той хрени которую ты хочеш вытащить (.*) \(.*
Но допустим мне нада написать |(любое число любых символов. ) 1+1| тоесть мне нада написать |(.*) \(.* 1+1 | я правильно думаю?

4epT
06.11.2007, 19:56
нет, не правельно, точнее не совсем правельно!

Допустим у нас есть некий шаблон
"Player .* is casting Extremity Fist on you"
сработает на:
Player 4epT (0) is casting Extremity Fist on you (time 920ms)
Player вапвапвап is casting Extremity Fist on you (time 920ms)
Player ыва ыва ыва ыва ыва is casting Extremity Fist on you (time 920ms)

в этом случае, если АМ сработает, то наши переменные $.lastMatch1, $.lastMatch2, $.lastMatch3, ... будут пустыми.

$.lastMatchN - это то что находится в скобках, например:

Player (.*) is casting Extremity Fist on you
сработает на:
Player 4epT (0) is casting Extremity Fist on you (time 920ms)
Player вапвапвап is casting Extremity Fist on you (time 920ms)
Player ыва ыва ыва ыва ыва is casting Extremity Fist on you (time 920ms)

тут $.lastMatch1 = тому, что будет написано между словами Player и is, т.е.
$.lastMatch1 = 4epT (0)
$.lastMatch1 = вапвапвап
$.lastMatch1 = ыва ыва ыва ыва ыва

$.lastMatch2 будет пустая, т.к скобки одни.

Обращаю внимание, что скобки "(" и ")" - это в шаблоне на самом деле не символ скобки, это так называемые метасимволы. Они ограничивают несколько символов, которые будут записаны в переменную $.lastMatch1.

Пример2:
(Player) (.*) is casting Extremity Fist on you
сработает на:
Player 4epT (0) is casting Extremity Fist on you (time 920ms)
Player вапвапвап is casting Extremity Fist on you (time 920ms)
Player ыва ыва ыва ыва ыва is casting Extremity Fist on you (time 920ms)


$.lastMatchN:

$.lastMatch1 = Player $.lastMatch2 = 4epT (0)
$.lastMatch1 = Player $.lastMatch2 = вапвапвап
$.lastMatch1 = Player $.lastMatch2 = ыва ыва ыва ыва ыва

Пример3:
наклонная черта "\" - отменяет значение метосимвола. Т.е. если мы напишем так:
Player (.*) \(.*\) is casting Extremity Fist on you
сработает на:
Player 4epT (0) is casting Extremity Fist on you (time 920ms)
Player вапвапвап (sdfsdf) is casting Extremity Fist on you (time 920ms)
Player ыва ыва ыва ыва ыва (ыва ывц43) is casting Extremity Fist on you (time 920ms)
не сработает на:
Player 4epT is casting Extremity Fist on you (time 920ms)
Player вапвапвап ( is casting Extremity Fist on you (time 920ms)
Player ыва ыва ыва ыва ыва ) is casting Extremity Fist on you (time 920ms)


$.lastMatchN:

$.lastMatch1 = 4epT
$.lastMatch1 = вапвапвап
$.lastMatch1 = ыва ыва ыва ыва ыва

$.lastMatch2 будет пустая, т.к скобки одни.

masterspirta
06.11.2007, 22:03
огромнейшее спасибо сам бы не разобрался теперь понял на 100% откуда ноги растут и на чом єто всё стоит!!!!!

4epT
06.11.2007, 22:13
masterspirta, может есть предложения как это более понятно написать?

masterspirta
08.11.2007, 15:48
я ещо чуть глубже капнул вот здесь--> (http://rofan.ru/viewtopic.php?t=1302)
Примеры
Что ищем : Ключевое выражение
слово "ракета": ракета
слово "ракета" или "космос" ракета|космос
слово "дом" и затем "строитель" дом.*строитель
слово "дом" и "строитель" в любой последовательности (дом.*строитель)|(строитель.* дом)
слово "выборы" с учетом окончания выбор(ы|ах|ам)
упоминания о политических партиях, слово партия находится не дальше 10 символов от слова политическая политическ(ая|ой|ую).{0,10}пар и(я|и|ю|ей)
губернаторские выборы (губернаторск(ие|их|им).{0,10}в ыбор(ы|ах|ам))|(выбор(ы|ах|ам). {0,10}губернатор(|а|у))
выборы, но не губернаторские выбор(ы|ах|ам).{0,10}(?!.*губерна тор(|а|у))

Логика разбора ключевых выражений

Любой символ обозначает себя самого если это не метасимвол. Если вам нужно отменить действие метасимвола то поставьте перед ним '\'.

Строка символов обозначает строку этих символов.

Множество возможных символов (класс) заключается в квадратные скобки '[]' это значит что в данном месте может стоять один из указанных в скобках символ. Если первый символ в скобках это '^' - значит не один из указанных символов не может стоять в данном месте выражения. Внутри класса можно употреблять символ '-' обозначающий диаппазон символов. Например a-z один из малых букв латинского алфавита, 0-9 - цифра и т.д.

Все символы, включая специальные можно обозначать с помощью '\' как в языке С.

Альтернативные последовательности разделяются символом '|' Заметьте, что внутри квадратных скобок это обычный символ.

Внутри регулярного выражения можно указыват "подшаблоны", заключая их в крунлые скобки и ссылаться на них как '\номер' Первая скобка обозначается как '\1'.
Логическая группировка
| - альтернатива (или)
() - группировка
Группировка: круглые скобки
Круглые скобки применяются для определения группы символов или части выражения, к которой относится символ альтернативы ("|") или модификатор.
Примеры
дом(ами|ом)=>"домами" или "домом"
домами|ом=>"домами" или "ом".
домами?=>"домами" или "домам".
дом(ами)?=>"дом" или "домами".
[] - класс символов
Примеры
[abc]=>"a", "b" или "c"
[^abc]=>любая строчная буква кроме "a", "b" или "c".
С применением модификаторов:
[a-z]?=>любая строчная буква, или отсутствие символа
.*=>любое число любых символов
Использование метасимволов:
\w - алфавитно-цифровой или '_' символ
\W - не алфавитно-цифровой или '_' символ
\s - один пробел
\S - один не пробел
\d - одна цифра
\D - одна не цифра

Обратите внимание что все это "один" символ. Для обозначения последовательности применяйте модификаторы. Так:
. - любой символ
\w+ - слово
\d+ - целое число
[+-]?\d+ - целое со знаком
[+-]?\d+\.?\d* - число с точкой
Модификаторы метасимволов
(пишутся после метасимвола):
* - повторяется 0 или большее число раз
+ - повторяется 1 или большее число раз
? - 1 или 0 раз
{n} - точно n раз
{n,} - по меньшей мере раз
{n,m} - не менше n, но и не больше m

Примеры
дома?=>"дом" или "дома"
дома+=>"дома", "домаа" и т.д.
дома*=>"дом", "дома", "домаа" и т.д

Во все других случаях фигурные скобки считаются обычными (регулярными) символами. Таким образом '*' эквивалентна {0,} , '+' - {1,} и '?' - {0,1}. n и m не могут быть больше 65536.

По умолчанию действие метасимволов "жадно" (greedy). Совпадение распространяется столько раз сколько возможно не учитывая результат действия следуюющих метасимволов. Если вы хотите "уменьшить их аппетит" то используйте символ '?'. Это не изменяет значение метасимволов просто уменьшает распространение. Таким образом:
*? - станет 0 и более
+? - 1 и более
?? - 0 или 1 раз
{n}? - точно n раз
{n,}? - не меньше n раз
{n,m}? - больше или равно n и меньше m раз
Расширенные возможности поиска
(?:шаблон) - группировка как и '( )' но без обратной ссылки
(?=шаблон) - "заглядывание" вперед.
Например \w+(?=\t) соответствует слову, за которым идет табуляция, но символ '\t' не включается в результат.
(?!шаблон) - "заглядывание" вперед по отрицанию.

Шаблон должен охватывать полностью предполагаемую область поиска. Рекомендуется использовать .* и прочие мультипликаторы.