Регулярные выражения в Webitel

Поскольку все чаще встречаюсь с непониманием того, что творится у нас в настройках маршрутизации, решил сегодня написать несколько слов о регулярных выражениях 🙂

Кода Вы открываете настройку исходящей маршрутизации, то можете увидеть вот такой кошмар:

Давайте на данном примере попытаемся понять, что и как работает.

^\+?38?(0[679]3\d{7})$

Данной регулярное выражение описывает коды украинского мобильного оператора lifecell. У данного оператора есть 3 кода: 63, 73 и 93. Номера телефонов пользователи могут набрать как в международном формате +38063ххххххх, в национальном формате 073ххххххх, так и вообще в устаревшем формате: 8093ххххххх. Вот таким выражением мы закрываем все варианты набора номера.

Рассмотрим более детальней:

  • ^ – начало регулярного выражения. Если не будет этого символа, тогда у нас получиться вхождение, а нам нужно нужно проверять с самого начала набранного номера. Значит для нас это обязательный символ.
  • \+? – дальше проверка на наличие +, поскольку это служебный символ, то мы его экранируем с помощью \. А вот наличие знака вопроса, ?, означает не обязательность +. Он может быть, а может и не быть – как-то так…
  • 3? – а это просто 3, которой вполне может и не быть (помните про наличие знака вопроса после цифры ?)
  • 8? – здесь то все понятно?
  • ( – начало блока совпадения. Все, что будет в круглый скобках, потом попадает в служебные переменные и может использоваться в маршрутизации звонков.
  • 0 – обязательно должен быть 0. Посмотрите на примеры выше – 0 всегда присутствует.
  • [679] – дальше должна идти одна из 3-х цифр: или 6, или 7 или же 9. Одна! Не три, а одна из 3 – просто уточняю 😉
  • 3 – а здесь обязательно должна быть тройка.
  • \d – этот незамысловатый знак говорит нам о наличие любой цифры (то же самое, если бы я написал вот так: [0-9]).
  • {7} – а теперь мы говорим о количестве повторений предыдущего выражения. Это означает, что любых цифр всего должно быть 7.
  • ) – закрываем блок совпадения.
  • $ – завершение регулярного выражения. Опять же, без него получается вхождение, поэтому для нас данный символ будет обязательным.

Для закрепления, рассмотрим еще один пример:

^\+?(7|8)(\d{10,12})$

Это регулярное выражение описывает все телефонные коды РФ (если честно, то и Казахстана, но, сейчас не об этом). Посмотрим только отличие от предыдущего:

  • 7|8 – вертикальная черточка говорит об ИЛИ. Может быть 8 либо 7 – одна из двух
  • {10,12} – опять количество повторений предыдущего выражения. Но, здесь у нас диапазон – не меньше 10 и не больше 12.

Так же, в отличие от предыдущего выражения, здесь у нас дважды встречаются круглые скобки, а это означает, что мы отдельно можем работать с первым и вторым совпадением. Что это означает? Давайте посмотрим на очень полезную функцию, которая должна появиться в следующем релизе – тест регулярного выражения:

  • &reg0.$0 – если нам нужен номер целиком
  • &reg0.$1 – если только совпадение в первых круглых скобках
  • &reg0.$2 – если совпадение во вторых круглых скобках

Провайдер требует от нас всегда присылать номера в национальном формате через 8. Для того, что бы набранный мною номер +74997045627 уходил к провайдеру в формате 84997045627, наш bridge должен быть вот таким:

{
    "bridge": {
        "endpoints": [
            {
                "dialString": "8&reg0.$2",
                "name": "myMskGw",
                "type": "sipGateway"
            }
        ]
    }
}

Надеюсь, что теперь стало немного понятьней, что такое регулярное выражение и как его правильно прочитать.

Leave a Reply

Your email address will not be published. Required fields are marked *