===== База регулярных выражений для плагинов 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}}