Регулярные выражения (Regular Expression) FreeSwitch
XML Диалплан FreeSWITCH широко использует Perl-совместимые регулярные выражения (PCRE). Результатом выполнения регулярного выражения является true/false на строку символов, это обычно называется сопоставление с образцом. Perl-совместимые регулярные выражения следуют очень особому синтаксису. Как только вы познакомитесь с основами синтаксиса, вы сможете оценить, насколько они сильны. Ниже приведены некоторые примеры регулярных выражений и их значения:
Шаблон | Значение |
---|---|
123 | Любая строка, содержащая последовательность"123" |
^123 | Любая строка, начинающаяся с цифр "123" |
123$ | Любая строка, заканчивающийся с последовательностью "123" |
^123$ | Любая строка, в точности повторяющая последовательность "123" |
\d | Совпадение одной цифры (0-9) |
\d\d | Совпадение двух последовательных цифр |
^\d\d\d$ | Любая строка которая имеет длину ровно 3 цифры |
^\d{7}$ | Любая строка которая имеет длину ровно 7 цифр |
^(\d{7})$ | Любая строка которая имеет длину ровно 7 цифр и сохраняет соответствующее значение в специальную переменную $1 |
^1?(\d{10})$ | Соответствие любой строке, которая начинается с цифры "1" и содержит дополнительные десять цифр, сохраняет десять цифр в $1 |
1^(3\d\d\d)$ | Соответствует любой строке из 4 цифр, которая начинается с цифры "3", и сохранить согласованный значение в $1 |
Соответствующие пункты в скобках отображены в переменную последовательность под названиями $1, $2 и т.д. $0 содержащую весь шаблон.
Любая строка из ровно семи цифр:
^(\d{7})$ Пример: 5551212 будет соответствовать $1 с "5551212" 95551212 не будет соответствовать (последовательность цифр слишком длинная) 555121A не будет соответствовать (альфа-символы не допускаются)
Любая строка из ровно 10 цифр:
^(\d{10})$ Пример: 8005551212 будет соответствовать $1 имеющий "8005551212" 18005551212 не будет соответствовать (последовательность цифр слишком длинная)
Любая строка из ровно 11 цифр:
^(\d{11})$ Пример: 18005551212 будет соответствовать $1 имеющий "18005551212" 8005551212 не будет соответствовать (последовательность цифр слишком
Строка с префиксом 9 и 11 дополнительных цифр:
^9(\d{11})$ Пример: 918005551212 будет соответствовать $1 имеющий "18005551212" 8005551212 не будет соответствовать (последовательность цифр слишком короткая)
Любая строка с точностью 3 или 4 цифры:
(^\d{4}$|^\d{3}$) Пример: 1001 будет соответствовать $1 имеющий "1001" 102 будет соответствовать $1 имеющий "102" *9999 не будет соответствовать *98 не будет соответствовать
Любая строка от 3 до 5 цифр:
(^\d{3,5}$) Пример: 10010 будет соответствовать $1 имеющий "10010" 102 будет соответствовать $1 имеющий "102" *9999 не будет соответствовать *98 не будет соответствовать
Переменное количество цифр после префикса '9':
^9(\d+)$ Пример: 977 будет соответствовать ($1 = 77) 877 не будет соответствовать 966736 будет соответствовать ($1 = 66736) 9118299983 будет соответствовать ($1 = 118299983) 9 не будет соответствовать (+ означает один или более)
Делаем шаблоны номеров операторов Беларуси
Velcom
- код +375 29 или 8029 для номеров 6хх хх хх, 3хх хх хх, 1хх хх хх, 9хх хх хх, 4хх хх хх;
- код +375 44 или 8044 для номеров 7хх хх хх.
^(8029[13469]|80447|+37529[13469]|+375447|0037529[13469]|00375447\d{6})$
Или шаблон замены префикса кода +375 на 80
<condition field="destination_number" expression="^+37529[13469]|+375447|0037529[13469]|00375447(\d{6})$"> <action application="bridge" data="sofia/gateway/gw_01/80$1"/>
МТС
- код +375 29 или 8029 для номеров 2xx xx xx, 5xx xx xx, 7xx xx xx, 8xx xx xx;
- код +375 33 или 8033 для номеров 6хх хх хх.
^(8029[2578]|80336|+37529[2578]|+375336|0037529[2578]|00375336\d{6})$
Или шаблон замены префикса кода +375 на 80
<condition field="destination_number" expression="^+37529[2578]|+375336|0037529[2578]|00375336(\d{6})$"> <action application="bridge" data="sofia/gateway/gw_01/80$1"/>
Life
- код +375 25 или 8025 для номеров xхх хх хх.
^(8025|+37525\d{7})$
Или шаблон замены префикса кода +375 на 80
<condition field="destination_number" expression="^+37525|0037525(\d{7})$"> <action application="bridge" data="sofia/gateway/gw_01/80$1"/>
Белтелеком
- код +375 24 или 8024 для номеров xхх хх хх – Максифон
- код +375 15 или 8015 для номеров xхх хх хх – Гродненская область
- код +375 16 или 8016 для номеров xхх хх хх – Брестская область
- код +375 17 или 8017 для номеров xхх хх хх – Минская область
- код +375 21 или 8021 для номеров xхх хх хх – Витебская область
- код +375 22 или 8022 для номеров xхх хх хх – Могилёвская область
- код +375 23 или 8023 для номеров xхх хх хх – Гомельская область
Минск
- для номеров xхх хх хх
^(801[567]|802[1234]\d{7})|\d{7})$
И алгоритм замены префиксов кода +375 на 80
<condition field="destination_number" expression="^+375|00375(1[567]|2[1234]\d{7})$"> <action application="bridge" data="sofia/gateway/gw_01/80$1"/>
Международные вызовы 810x
^(810\d+)$
Захват значений
Иногда необходимо, использовать скобки для группировки вариантов набор, для экономии записей шаблона. Поставьте вопросительный знак с двоеточием после открывающей скобки для достижения этой цели. Например, приведенный ниже, соответствует набранному "+" или "00", но соответствующие символы не сохраняются.
^(?:\+|00)(\d+)$ Пример: +13171222222 совпадение и захват 13171222222 в $1 0013171222222 совпадение и захват 13171222222 в $1
Следующий пример совпадает с набранным номером и сохраняет информацию на две части, как главных символы ($1) и номер телефона ($2).
^(\+|00)(\d+)$ Пример: +13171222222 совпадение и захват + в $1 и 13171222222 в $2 0013171222222 совпадение и захват 00 в $1 и 13171222222 в $2
Скобки могут быть вложенными. При попытке определить, какие переменная содержит соответствующую информацию, подсчет открывающей скобки слева направо. Первый блок в скобках хранить информацию в $1, второй блок в скобках будет сохранять информацию в $2 и так далее.
^((\+|00)(\d+))$ Пример: +13171222222 совпадение и захват +13171222222 в $1, + в $2 и 13171222222 в $3 0013171222222 совпадение и захват 0013171222222 в $1, 00 в $2 и 13171222222 в $3
В следующем примере, первый блок скобок не сохраняет любую информацию.
^(?:(\+|00)(\d+))$ Пример: +13171222222 совпадение и захват + в $1 и 13171222222 в $2 0013171222222 совпадение и захват 00 в $1 и 13171222222 в $2
Пример шаблона:
^(\+?1)?(8(00|44|55|66|77|88)[2-9]\d{6})$
^ - указывает на начало регулярного выражения (обязательно);
( - указывает на начало блока регулярного выражения - в блоке важно определить внутренние выражение, чтобы в них можно было ссылаться на переменные $ 1, $ 2, $ 3, и т.д.;
\+1|1? - указывает "+1" или "1" необязательные цифры (знак ? определяет значение как необязательное);
) - закрывает блок;
8 - соответствует символу '8';
( - открывает новый блок;
00|55|66|77|88 - соответствует 00 или 55 или 66 или 77 или 88;
) - закрывает внутренний блок;
[2-9] - соответствует одной цифре в интервале от 2 до 9 (2, 3, 4, 5, 6, 7, 8 и 9), и как вы уже догадались пара скобок [ ] скобок охватывает определенный диапазон;
другие примеры диапазона: [0-9] соответствует 0 до 9; [a-z] соответствует a, b, c, ...z);
\d - соответствует любой допустимой цифре (такой же, как [0-9]);
{6} - определяет число вхождений для предыдущего выражения, т.е. ровно 6 цифрам в диапазоне 0-9. Это также может содержать переменное число вхождений, например, чтобы соответствовать последовательность 6 до 9 цифр: {6,9}; или соответствовать по крайней мере 6 без максимального: {6};
) - закрывает другой блок;
$ - указывает на конец регулярного выражения (обязательно);
Коментарии: