Регулярные выражения (Regular Expression) FreeSwitch

Опубликовано в Freeswitch

FreeSwitch Perl Compatible Regular Expressions

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};

) - закрывает другой блок;

$ - указывает на конец регулярного выражения (обязательно);

Коментарии: