===== База регулярных выражений для плагинов im-клиентов ===== ==== Официальные регулярные выражения ==== **Авторы**: @freefd, @ugnich\\ **Язык разработки**: Perl\\ Используются в скрипте парсинга web-интерфейса Джуика.\\ Регулярные выражения приведены в качестве параметров perl'овской функции замены в тексте по регулярному выражению\\ s{regexp}{subst_text}[modificators];\\ ^ Параметр ^ Описание ^ | regexp | Регулярное выражение, по которому производится замена. | | subst_text | Текст замены. В $n доступны сохраннёные группы из regexp. | | modificators | Модификаторы регулярного выражения. | ===Ссылки=== s{((?<=\s)|(?<=\A))((?:ht|f)tps?://(?:www\.)?([^\/\s\n\"]+)/?[^\s\n\"]*)}{$1$3}go; Преобразовывает //%%http://juick.com/last?page=2%%// в //%%juick.com%%// ===Ссылки в скобках=== s{((?<=\s)|(?<=\A))([\(\[\{]|<)((?:ht|f)tps?://(?:www\.)?([^\/\s\n\"\)\!]+)/?[^\s]*)([\)\]\}]|>)}{$1$2$4$5}go; Преобразовывает //%%(http://juick.com/last?page=2)%%// в //%%(juick.com)%%// ===Id сообщений=== s{((?<=\s)|(?<=\A)|(?<=[[:punct:]]))#(\d+)((?=\s)|(?=\Z)|(?=\))|(?=\.)|(?=\,))}{$1#$2$3}g; Преобразовывает //%%#12345%%// в //%%#12345%%// ===Id сообщений + id комментариев=== s{((?<=\s)|(?<=\A)|(?<=[[:punct:]]))#(\d+)/(\d+)((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1#$2/$3$4}g; Преобразовывает //%%#12345/65%%// в //%%#12345/65%%// ===Форматирование (жирный)=== s{((?<=\s)|(?<=\A)|(?<=[[:punct:]]))\*([^\*\n<>]+)\*((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1$2$3}g; Преобразовывает //%%*bold*%%// в //%%bold%%// ===Форматирование (курсив)=== s{((?<=\s)|(?<=\A))/([^\/\n<>]+)/((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1$2$3}g; Преобразовывает //%%/italic/%%// в //%%italic%%// ===Форматирование (подчёркнутый)=== s{((?<=\s)|(?<=\A))_([^\_\n<>]+)_((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1$2<\/span>$3}g; Преобразовывает //%%_underline_%%// в //%%underline%%// ===Id комментариев=== s{((?<=\s)|(?<=\A))\/(\d+)((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1/$2$3}g; Преобразовывает //%%/12%%// в //%%/12%%// ===Jid'ы=== s{((?<=\s)|(?<=\A))\@([\w\-\|\.]+\@[\w\-\.]+)((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1\@$2<\/a>$3}g; Преобразовывает //%%@username@jabber.org%%// в //%%@username@jabber.org%%// ===Ники=== s{((?<=\s)|(?<=\A))\@([\w\-]+)((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1\@$2<\/a>$3}g; Преобразовывает //%%@username%%// в //%%@username%%// ==== BombusMod ==== **Автор плагина:** @Totktonada\\ **Язык разработки:** J2ME Собственно, регулярных выражений как таковых тут нет. Есть метод viewJuickThings в который передаётся тело сообщения и потом перебирается по одному символу в цикле. В итоге номера сообщений, ники и теги (далее — "сущности") оказываются прямо в Vector'е things. === viewJuickThings (частично && по кусочкам) === public void viewJuickThings(String str) { ... char[] valueChars = str.toCharArray(); int msg_length = valueChars.length; Vector things = new Vector(); for (int i = 0; i < msg_length; i++) { if ((i == 0) || isCharBeforeJuickThing(valueChars[i - 1])) { switch (valueChars[i]) { case '#': case '@': case '*': char firstSymbol = valueChars[i]; String thing = "" + firstSymbol; Здесь мы "находимся" в начале "сущности". Прибавляем к ней по символу, пока не встретится конец сообщения или какой-нибудь символ, который не может присутствовать в "сущности" (например, пробел). while (i < (msg_length - 1) && isCharFromJuickThing(valueChars[++i], firstSymbol)) { thing = thing + valueChars[i]; } Убираем точки с конца. while (thing.charAt(thing.length() - 1) == '.') { thing = thing.substring(0, thing.length() - 1); } Если в "сущности" не только знак '#', '@' или '*' и она не встречалась ранее в этом же сообщении, то добавляем её к Vector'у. При условии, что это не тег, после которого идёт '*' (по идее это жирное выделение). if ((thing.length() > 1) && (things.indexOf(thing) < 0)) { if (i < msg_length && ((firstSymbol == '*') && (valueChars[i] == '*'))) { continue; } things.addElement(thing); } if (i > 0) { i--; } break; } } } ... } === isCharBeforeJuickThing === Символы, которые могут предшествовать "сущности". public boolean isCharBeforeJuickThing(char ch) { switch(ch) { case '\u0020': // space case '\u0009': // tab case '\u000C': // formfeed case '\n': // newline case '\r': // carriage return case '(': return true; } return false; } === isCharFromJuickThing === Символы, которые могут присутствовать в "сущности". public boolean isCharFromJuickThing(char ch, char type) { boolean result = false; switch(type) { case '#': // #number result = (ch>46) && (ch<58); // [0-9/] break; case '@': // @username result = ((ch>47)&&(ch<58)) || ((ch>63)&&(ch<91)) || ((ch>96)&&(ch<123)) || ((ch=='_')||(ch=='|')) || ((ch>44)&&(ch<47)); // [a-zA-Z0-9-.@_|] break; case '*': // *tag result = ((ch>42)&&(ch<58)) || ((ch>64)&&(ch<91)) || ((ch>96)&&(ch<123)) || ((ch>1039)&&(ch<1104)) || ((ch=='_')||(ch=='|')||(ch=='?')||(ch=='!')||(ch==39)) || ((ch>44)&&(ch<47)); // [a-zA-ZА-Яа-я0-9-.,/+_|?!']) break; } return result; } ==== Miranda IM ==== **Название плагина:** Miranda Juick Plugin (mjp)\\ **Автор плагина:** @longedok\\ **Язык разработки:** JavaScript\\ **Регулярные выражения:** Все слеши в следующих регулярных выражениях заэкранированы бэкслешем (\/). === Номера сообщений === #123456, #123456/12 Регулярное выражение: \B((#\d+)(\/\d+)?)\b Сохранённые группы для строки %%"#123456/123"%%: ^ Группа ^ Содержание ^ | $1 | %%#123456/123%% | | $2 | %%#123456%% | | $3 | %%/123%% | === Ники === @username, @username@server.ru Регулярное выражение: \B(@[a-zA-Z0-9-.@_|]+)\b Сохранённые группы для строки %%"@username"%%: ^ Группа ^ Содержание ^ | $1 | %%@username%% | === Теги === *tag1, *tag!, *? Регулярное выражение: (?<=
\B(@[a-zA-Z0-9-.@_|]+)\b:( ?(\*\S+?)(?=
| \*))*) (\*\S+?)(?=
| \*)
Из-за недостатков реализации регулярных выражений в JavaScript, данное выражение на практике не используется. Но, в то же время оно позволяет очень точно определять теги именно там, где нужно и не совпадает ни с чем лишним. Также, это выражение разрабатывалось с учётом специфики плагина IEView, для Miranda IM, поэтому вместо обработки переводов строк, в нём учитываются html-теги
. ==== Tkabber ==== **Название плагина:** Tkabber4Juick\\ **Авторы плагина:** @roche, @Totktonada\\ **Язык разработки:** tcl/tk === Номера сообщений, ники, теги === set matched [regexp -indices -start $at -- \ {(?:\s|\n|\A|\(|\>)(#\d+(/\d+)?|@[\w@.-]+|\*[\w?!+'/.-]+)(?:(\.(\s|\n))?)} $what -> bounds] === Цитаты === set matched [regexp -indices -start $at -- \ {(?:\n|\A)(>[^\n]+)} $what -> bounds] ==== Прочее ==== Пост, в комментариях которого сообщения, могущие быть проблемными при обработке плагинами: #168322. {{tag>jabber juick}}