Table of Contents
База регулярных выражений для плагинов 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<a href="$2" rel="nofollow">$3</a>}go;
Преобразовывает http://juick.com/last?page=2 в <a href="http://juick.com/last?page=2" rel="nofollow">juick.com</a>
Ссылки в скобках
s{((?<=\s)|(?<=\A))([\(\[\{]|<)((?:ht|f)tps?://(?:www\.)?([^\/\s\n\"\)\!]+)/?[^\s]*)([\)\]\}]|>)}{$1$2<a href="$3" rel="nofollow">$4</a>$5}go;
Преобразовывает (http://juick.com/last?page=2) в (<a href="http://juick.com/last?page=2" rel="nofollow">juick.com</a>)
Id сообщений
s{((?<=\s)|(?<=\A)|(?<=[[:punct:]]))#(\d+)((?=\s)|(?=\Z)|(?=\))|(?=\.)|(?=\,))}{$1<a href="http://juick.com/$2">#$2</a>$3}g;
Преобразовывает #12345 в <a href="http://juick.com/12345">#12345</a>
Id сообщений + id комментариев
s{((?<=\s)|(?<=\A)|(?<=[[:punct:]]))#(\d+)/(\d+)((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1<a href="http://juick.com/$2#$3">#$2/$3</a>$4}g;
Преобразовывает #12345/65 в <a href="http://juick.com/12345#65">#12345/65</a>
Форматирование (жирный)
s{((?<=\s)|(?<=\A)|(?<=[[:punct:]]))\*([^\*\n<>]+)\*((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1<b>$2</b>$3}g;
Преобразовывает *bold* в <b>bold</b>
Форматирование (курсив)
s{((?<=\s)|(?<=\A))/([^\/\n<>]+)/((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1<i>$2</i>$3}g;
Преобразовывает /italic/ в <i>italic</i>
Форматирование (подчёркнутый)
s{((?<=\s)|(?<=\A))_([^\_\n<>]+)_((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1<span class="u">$2<\/span>$3}g;
Преобразовывает _underline_ в <span class="u">underline</span>
Id комментариев
s{((?<=\s)|(?<=\A))\/(\d+)((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1<a href="#$2">/$2</a>$3}g;
Преобразовывает /12 в <a href="#12">/12</a>
Jid'ы
s{((?<=\s)|(?<=\A))\@([\w\-\|\.]+\@[\w\-\.]+)((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1<a href="http://juick.com/$2/">\@$2<\/a>$3}g;
Преобразовывает @username@jabber.org в <a href="http://juick.com/username@jabber.org/">@username@jabber.org</a>
Ники
s{((?<=\s)|(?<=\A))\@([\w\-]+)((?=\s)|(?=\Z)|(?=[[:punct:]]))}{$1<a href="http://juick.com/$2/">\@$2<\/a>$3}g;
Преобразовывает @username в <a href="http://juick.com/username/">@username</a>
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!, *?
Регулярное выражение: (?<=<br>\B(@[a-zA-Z0-9-.@_|]+)\b:( ?(\*\S+?)(?=<br>| \*))*) (\*\S+?)(?=<br>| \*)
Из-за недостатков реализации регулярных выражений в JavaScript, данное выражение на практике не используется. Но, в то же время оно позволяет очень точно определять теги именно там, где нужно и не совпадает ни с чем лишним. Также, это выражение разрабатывалось с учётом специфики плагина IEView, для Miranda IM, поэтому вместо обработки переводов строк, в нём учитываются html-теги <br>.
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.
jabber juick