ПРИЛОЖЕНИЕ Б. Библиотека регулярных выражений
Библиотека регулярных выражений разработана А.В. Сорокиным (г. С-Петербург, anso@mail.ru). В ПО «ОИК Диспетчер НТ» включена версия v.938.2000.07.23.
Регулярные выражения используются при настройке расширенного фильтра отбора записей для просмотра ретроспективы событий (полной или по объекту) и записей в журнале тревог.
Представление шаблонов для отбора записей в виде регулярных выражений наиболее эффективный способ описания фильтров для отбора записей, представляющих собой строковые выражения. Алгоритм расширенного фильтра распространяется только на ту рабочую станцию, с которой это описание было введено. Для того, чтобы не вводить один и тот же алгоритм фильтрации для подобных в этом отношении рабочих станций, можно подменить файл WinDisp.ini в каталоге установки клиента.
Регулярное выражение – это строка символов, в которой описаны правила сравнения выбираемых из базы данных строк. Оно может включать символы, которые сравниваются один в один, а также метасимволы или метасимволы с модификаторами.
Перечень метасимволов приведен ниже:
\ - читать следующий символ буквально (кроме:d, D, w, W, s, S, n, t, r, f, x);
\\ - просто символ “\”;
^ - начало строки (\^ - просто символ “^”);
$ - конец строки;
. - один произвольный символ (кроме конца строки);
| - альтернатива логического ИЛИ;
() - для выделения подвыражений. Подвыражения нумеруются слева направо, начиная с 1 (регулярное выражение в целом имеет номер 0);
[] - один символ из указанного в скобках набора;
\d - одна цифра;
\D - одна не цифра;
\w - алфавитно - цифровой символ или символ “_”;
\W - не алфавитно - цифровой символ и не символ “_”;
\s - пробельный символ;
\n - конец строки;
\t - табуляция;
\r - перевод строки;
\f - конец страницы;
\S - не пробельный символ;
\xnn - символ в шестнадцатеричном коде (если Unicode символа < 256);
\x{nnnn} - символ в шестнадцатеричном коде (для двухбайтных символов).
Примеры регулярных выражений, составленных с использованием метасимволов:
[а-я] - любой символ из набора “малые русские символы” в Win1251;
[а-я0-9] - любой русский символ в нижнем регистре или цифра;
[+-] - символ “+” или “-“;
[А-Я] - все большие русские символы в Win1251;
[а-Я] - все русские символы в Win1251.
Метасимволы могут иметь модификаторы, которые пишутся после метасимволов:
* – предыдущий символ или группировка повторяется 0 или большее число раз {0,};
+ – предыдущий символ или группировка повторяется 1 или большее число раз {1,};
? – предыдущий символ или группировка повторяется 0 или 1 раз - {0,1};
{n} – повторяется n раз;
{n,} – повторяется не менее n раз;
{n,m} – повторяется от n до m раз.
Метасимволы могут иметь модификаторы, которые указывают диапазон действия модификатора:
(?i)…(?-i) - проверка символов без учёта регистра;
(?m)…(?-m) - воспринимать входной фрагмент как многострочный, то есть метасимволы “^” и “$” совпадают с началом и концом строки внутри фрагмента (обычно – только с началом и концом фрагмента);
(?s)…(?-s) - воспринимать входной фрагмент как единую строку – метасимвол “.” совпадает с любым символом, в том числе и с “\n” (обычно он не совпадает с “\n”). Можно комбинировать два последних модификатора:
s (без m) - заставит “^” совпадать только с началом фрагмента, а “$” – с концом;
ms вместе - позволят “.” совпадать со всеми символами включая начало строки внутри фрагмента, однако “^” и “$” при этом будут совпадать с началом и концом строки внутри фрагмента;
(?x)…(?-x) - расширенный синтаксис, допускающий применение пробельных символов и комментариев для оформления регулярного выражения;
(?r)…(?-r) - диапазон “а-я” включает символ “ё”, а диапазон “А-Я” – “Ë”.
Модификатор диапазона может содержать только признак начала действия, а признак конца действия модификатора при этом отсутствует.
Примеры регулярных выражений, составленных с использованием метасимволов и модификаторов:
\w+ - любое слово;
\d+ - любое целое число;
[+-]?\d+ - любое целое число со знаком или без знака;
[+-]?\d+\.,\d* - любое число, у которого может быть дробная часть;
[-az] [az-] [a\-z] - это идентичные перечни;
[\n-\x0D] - перечень из 4-х символов – 10,11,12,13 (\n = \x0A);
[\d-t] - любая цифра или t;
[]-a] - любой символ из диапазона от «]» до «a»;
(?i)Saint-Petersburg - совпадает с: saint-petersburg, saint-Petersburg, Saint-petersburg, Saint-Petersburg;
(?i)Saint-(?-i)Petersburg - совпадает с Saint-Petersburg и saint-Petersburg;
(?i)(Saint-)?Petersburg - совпадает с: saint-petersburg, saint-Petersburg, Saint-petersburg, Saint-Petersburg и Petersburg;
((?i)Saint-)?Petersburg - совпадает с: saint-Petersburg, Saint-Petersburg и Petersburg, то есть диапазон действует только внутри скобок.
Правила составления регулярных выражений:
1. Любой символ обозначает самого себя, если это не метасимвол. Для отмены действия метасимвола перед ним необходимо поставить символ «\»;
2. Строка символов без метасимволов обозначает строку этих символов;
3. Множество всевозможных символов (класс) заключенных в квадратные скобки означает, что в данном месте сравниваемой строки может быть один из символов, перечисленных в скобках. Если в качестве первого символа в скобках указан символ «^», то это означает, что ни один из символов, перечисленных в скобках не может быть на данном месте в выражении. Внутри класса можно использовать символ “-“, обозначающий диапазон символов, например, 0-9 – любая цифра. Метасимволы \w, \d и \s можно использовать в диапазонах;
4. Альтернативные последовательности разделяются символом «|». Внутри квадратных скобок – это обычный символ;
5. При наличии повторений внутри регулярного выражения можно указывать подвыражения. Описание подвыражения, заключая в круглые скобки и должно быть в выражении до первой ссылки на него. Ссылка на подвыражение имеет вид – \номер. Ссылка на первую скобку обозначается, как \1, вторую - \2 и так далее;
6. Текст комментария “text” может быть включен следующим образом: (?#text). Концом комментария считается первый символ «)», поэтому нет никакой возможности использовать его внутри комментария.
Примеры регулярных выражений:
Вещественное число, например, 13.88е-4
([+-]?\d+(\.\d+)?([eE][+\-]?\d+)?)
Номер телефона, например, +7(095)555-5555 (3432)555-55-55 555-5555
((\+\d*)?(\(d{3,4}\)*)?\d+(-\d*)*)
([_a-zA-Z\d\-]+)@\1(\.\1)+
Все ТС нулевого канала на КП №11 #ТС0:11:\d+
Все ТС нулевого канала, содержащие в имени строку символов «220»
#ТС0:\d+:\d+.*220
ТС с 3 по 9, с 13 по 19 и 20 для КП с номером 4 из нулевого канала
#ТС0:4:(3|4|5|6|7|8|9|13|14|15|15|17|18|19|20)$ или то же самое
#ТС0:4:([3-9]|1[3-9]|20)$
при этом в настройке расширенного фильтра область действия должна быть – «Только ТМ адрес».