D 8 1 регулярное выражение что значит
Перейти к содержимому

D 8 1 регулярное выражение что значит

  • автор:

Квантификаторы +, *, ? и

Давайте возьмём строку вида +7(903)-123-45-67 и найдём все числа в ней. Но теперь нас интересуют не цифры по отдельности, а именно числа: 7, 903, 123, 45, 67 .

Число — это последовательность из 1 или более цифр \d . Чтобы указать количество повторений, нам нужно добавить квантификатор.

Количество

Самый простой квантификатор — это число в фигурных скобках: .

Он добавляется к символу (или символьному классу, или набору [. ] и т.д.) и указывает, сколько их нам нужно.

Можно по-разному указать количество, например:

Шаблон \d обозначает ровно 5 цифр, он эквивалентен \d\d\d\d\d .

Следующий пример находит пятизначное число:

alert( "Мне 12345 лет".match(/\d/) ); // "12345"

Мы можем добавить \b , чтобы исключить числа длиннее: \b\d\b .

Диапазон: , от 3 до 5

Для того, чтобы найти числа от 3 до 5 цифр, мы можем указать границы в фигурных скобках: \d

alert( "Мне не 12, а 1234 года".match(/\d/) ); // "1234"

Верхнюю границу можно не указывать.

Тогда шаблон \d найдёт последовательность чисел длиной 3 и более цифр:

alert( "Мне не 12, а 345678 лет".match(/\d/) ); // "345678"

Давайте вернёмся к строке +7(903)-123-45-67 .

Число – это последовательность из одной или более цифр. Поэтому шаблон будет \d :

let str = "+7(903)-123-45-67"; let numbers = str.match(/\d/g); alert(numbers); // 7,903,123,45,67

Короткие обозначения

Для самых востребованных квантификаторов есть сокращённые формы записи:

Означает «один или более». То же самое, что и .

Например, \d+ находит числа (из одной или более цифр):

let str = "+7(903)-123-45-67"; alert( str.match(/\d+/g) ); // 7,903,123,45,67

Означает «ноль или один». То же самое, что и . По сути, делает символ необязательным.

Например, шаблон ou?r найдёт o после которого, возможно, следует u , а затем r .

Поэтому шаблон colou?r найдёт два варианта: color и colour :

let str = "Следует писать color или colour?"; alert( str.match(/colou?r/g) ); // color, colour

Означает «ноль или более». То же самое, что и . То есть символ может повторяться много раз или вообще отсутствовать.

Например, шаблон \d0* находит цифру и все нули за ней (их может быть много или ни одного):

alert( "100 10 1".match(/\d0*/g) ); // 100, 10, 1

Сравните это с + (один или более):

alert( "100 10 1".match(/\d0+/g) ); // 100, 10 // 1 не подходит, т.к 0+ требует как минимум один ноль

Ещё примеры

Квантификаторы используются очень часто. Они служат основными «строительными блоками» сложных регулярных выражений, поэтому давайте рассмотрим ещё примеры.

Регулярное выражение для десятичных дробей (чисел с плавающей точкой): \d+\.\d+

alert( "0 1 12.345 7890".match(/\d+\.\d+/g) ); // 12.345

Регулярное выражение для «открывающего HTML-тега без атрибутов», например, или

.

alert( " . ".match(/<[a-z]+>/gi) ); //
alert( "

Привет!

".match(/<[a-z][a-z0-9]*>/gi) ); //

Регулярное выражение для «открывающего или закрывающего HTML-тега без атрибутов»: //i

В начало предыдущего шаблона мы добавили необязательный слеш /? . Этот символ понадобилось заэкранировать, чтобы JavaScript не принял его за конец шаблона.

alert( "

Привет!

".match(//gi) ); //

,

Чтобы регулярное выражение было точнее, нам часто приходится делать его сложнее

В этих примерах мы видим общее правило: чем точнее регулярное выражение – тем оно длиннее и сложнее.

Например, для HTML-тегов без атрибутов, скорее всего, подошло бы и более простое регулярное выражение: <\w+>. Но стандарт HTML накладывает более жёсткие ограничения на имя тега, так что более точным будет шаблон <[a-z][a-z0-9]*>.

Подойдёт ли нам <\w+>или нужно использовать <[a-z][a-z0-9]*>? А, может быть, нужно ещё его усложнить, добавить атрибуты?

В реальной жизни допустимы разные варианты. Ответ на подобные вопросы зависит от того, насколько реально важна точность и насколько потом будет сложно или несложно отфильтровать лишние совпадения.

Регулярные выражения (Regular Expression) 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 цифр
^(\d)$ Любая строка которая имеет длину ровно 7 цифр и сохраняет соответствующее значение в специальную переменную $1
^1?(\d)$ Соответствие любой строке, которая начинается с цифры «1» и содержит дополнительные десять цифр, сохраняет десять цифр в $1
1^(3\d\d\d)$ Соответствует любой строке из 4 цифр, которая начинается с цифры «3», и сохранить согласованный значение в $1

Соответствующие пункты в скобках отображены в переменную последовательность под названиями $1, $2 и т.д. $0 содержащую весь шаблон.

Любая строка из ровно семи цифр:

^(\d)$ Пример: 5551212 будет соответствовать $1 с "5551212" 95551212 не будет соответствовать (последовательность цифр слишком длинная) 555121A не будет соответствовать (альфа-символы не допускаются)

Любая строка из ровно 10 цифр:

^(\d)$ Пример: 8005551212 будет соответствовать $1 имеющий "8005551212" 18005551212 не будет соответствовать (последовательность цифр слишком длинная)

Любая строка из ровно 11 цифр:

^(\d)$ Пример: 18005551212 будет соответствовать $1 имеющий "18005551212" 8005551212 не будет соответствовать (последовательность цифр слишком

Строка с префиксом 9 и 11 дополнительных цифр:

^9(\d)$ Пример: 918005551212 будет соответствовать $1 имеющий "18005551212" 8005551212 не будет соответствовать (последовательность цифр слишком короткая)

Любая строка с точностью 3 или 4 цифры:

(^\d$|^\d$) Пример: 1001 будет соответствовать $1 имеющий "1001" 102 будет соответствовать $1 имеющий "102" *9999 не будет соответствовать *98 не будет соответствовать

Любая строка от 3 до 5 цифр:

(^\d$) Пример: 10010 будет соответствовать $1 имеющий "10010" 102 будет соответствовать $1 имеющий "102" *9999 не будет соответствовать *98 не будет соответствовать

Переменное количество цифр после префикса ‘9’:

^9(\d+)$ Пример: 977 будет соответствовать ($1 = 77) 877 не будет соответствовать 966736 будет соответствовать ($1 = 66736) 9118299983 будет соответствовать ($1 = 118299983) 9 не будет соответствовать (+ означает один или более)

Делаем шаблоны номеров операторов Беларуси

Velcom

^(8029[13469]|80447|+37529[13469]|+375447|0037529[13469]|00375447\d)$

Или шаблон замены префикса кода +375 на 80

 field="destination_number" expression="^+37529[13469]|+375447|0037529[13469]|00375447(\d)$">  application="bridge" data="sofia/gateway/gw_01/80$1"/>

МТС

^(8029[2578]|80336|+37529[2578]|+375336|0037529[2578]|00375336\d)$

Или шаблон замены префикса кода +375 на 80

 field="destination_number" expression="^+37529[2578]|+375336|0037529[2578]|00375336(\d)$">  application="bridge" data="sofia/gateway/gw_01/80$1"/>

Life

^(8025|+37525\d)$

Или шаблон замены префикса кода +375 на 80

 field="destination_number" expression="^+37525|0037525(\d)$">  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)|\d)$

И алгоритм замены префиксов кода +375 на 80

 field="destination_number" expression="^+375|00375(1[567]|2[1234]\d)$">  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)$

^ — указывает на начало регулярного выражения (обязательно);

( — указывает на начало блока регулярного выражения — в блоке важно определить внутренние выражение, чтобы в них можно было ссылаться на переменные $ 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 цифрам в диапазоне 0-9. Это также может содержать переменное число вхождений, например, чтобы соответствовать последовательность 6 до 9 цифр: ; или соответствовать по крайней мере 6 без максимального: ;

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

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

Руководство администратора

term_icon

Регулярные выражения (англ. regular expressions, сокр. RegExp, RegEx) — это формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов. По сути это строка-образец (англ. pattern, по-русски её часто называют «шаблоном», «маской»), состоящая из символов и метасимволов и задающая правило поиска. Применение регулярных выражений позволяет сделать поиск и замену в тексте максимально эффективными.

В настройках Дополнительных параметров есть возможность использовать регулярные выражения. Для этого необходимо зайти в редактирование дополнительных параметров.

dp_regular

Поле для ввода регулярного выражения в настройках ДП.

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

Шпаргалка по регулярным выражениям. В примерах

Регулярные выражения (regex или regexp) очень эффективны для извлечения информации из текста. Для этого нужно произвести поиск одного или нескольких совпадений по определённому шаблону (т. е. определённой последовательности символов ASCII или unicode).

Области применения regex разнообразны, от валидации до парсинга/замены строк, передачи данных в другие форматы и Web Scraping’а.

Одна из любопытных особенностей регулярных выражений в их универсальности, стоит вам выучить синтаксис, и вы сможете применять их в любом (почти) языке программирования (JavaScript, Java, VB, C #, C / C++, Python, Perl, Ruby, Delphi, R, Tcl, и многих других). Небольшие отличия касаются только наиболее продвинутых функций и версий синтаксиса, поддерживаемых движком.

Давайте начнём с нескольких примеров.

Основы

Якоря — ^ и $

^Привет соответствует строке, начинающейся с Привет -> тестпока$ соответствует строке, заканчивающейся на пока^Привет пока$ точное совпадение (начинается и заканчивается как Привет пока)воробушки соответствует любой строке, в которой есть текст воробушки

Квантификаторы — * + ? и <>

abc* соответствует строке, в которой после ab следует 0 или более символов c -> тестabc+ соответствует строке, в которой после ab следует один или более символов cabc? соответствует строке, в которой после ab следует 0 или один символ cabc соответствует строке, в которой после ab следует 2 символа cabc соответствует строке, в которой после ab следует 2 или более символов cabc соответствует строке, в которой после ab следует от 2 до 5 символов ca(bc)* соответствует строке, в которой после ab следует 0 или более последовательностей символов bca(bc) соответствует строке, в которой после ab следует от 2 до 5 последовательностей символов bc

Оператор ИЛИ — | или []

a(b|c) соответствует строке, в которой после a следует b или c -> тестa[bc] как и в предыдущем примере

Символьные классы — \d \w \s и .

\d соответствует одному символу, который является цифрой -> тест\w соответствует слову (может состоять из букв, цифр и подчёркивания) -> тест\s соответствует символу пробела (включая табуляцию и прерывание строки). соответствует любому символу -> тест

Используйте оператор . с осторожностью, так как зачастую класс или отрицаемый класс символов (который мы рассмотрим далее) быстрее и точнее.

У операторов \d , \w и \s также есть отрицания ― \D, \W и \S соответственно.

Например, оператор \D будет искать соответствия противоположенные \d .

Непечатаемые символы также можно искать, например табуляцию \t , новую строку \n , возврат каретки \r .

Флаги

Мы научились строить регулярные выражения, но забыли о фундаментальной концепции ― флагах.

Регулярное выражение, как правило, записывается в такой форме / abc /, где шаблон для сопоставления выделен двумя слешами / . В конце выражения, мы определяем значение флага (эти значения можно комбинировать):

  • g (global) ― не возвращает результат после первого совпадения, а продолжает поиск с конца предыдущего совпадения.
  • m (multi line) ― с таким флагом, операторы ^ и $ вызовут совпадение в начале и конце строки ввода (line), вместо строки целиком (string).
  • i (insensitive) ― делает выражение регистронезависимым (например, /aBc/i соответствует AbC).

Средний уровень

Скобочные группы ― ()

a(bc) создаём группу со значением bc -> тестa(?:bc)* оперетор ?: отключает группу -> тестa(?bc) так, мы можем присвоить имя группе -> тест

Этот оператор очень полезен, когда нужно извлечь информацию из строк или данных, используя ваш любимый язык программирования. Любые множественные совпадения, по нескольким группам, будут представлены в виде классического массива: доступ к их значениям можно получить с помощью индекса из результатов сопоставления.

Если присвоить группам имена (используя (? . ) ), то можно получить их значения, используя результат сопоставления, как словарь, где ключами будут имена каждой группы.

Скобочные выражения ― []

[abc] соответствует строке, которая содержит либо символ a или a b или a c -> такой же эффект от a|b|c -> тест[a-c] то же, что и выше[a-fA-F0–9] строка, представляющая одну шестнадцатеричную цифру без учёта регистра -> тест[0–9]% строка, содержащая символ от 0 до 9 перед знаком %[^a-zA-Z] строка, которая не имеет буквы от a до z или от A до Z. В этом случае ^ используется как отрицание в выражении -> тест

Помните, что внутри скобочных выражений все специальные символы (включая обратную косую черту \ ) теряют своё служебное значение, поэтому нам ненужно их экранировать.

Жадные и ленивые сопоставления

Квантификаторы ( * + <> ) ― это «жадные» операторы, потому что они продолжают поиск соответствий, как можно глубже ― через весь текст.

Например, выражение <.+>соответствует

simple div

в This is a

simple div

test . Чтобы найти только тэг div ― можно использовать оператор ? , сделав выражение «ленивым»:

Обратите внимание, что хорошей практикой считается не использовать оператор . , в пользу более строгого выражения:

Продвинутый уровень

Границы слов ― \b и \B

\b ― соответствует границе слова, наподобие якоря (он похож на $ и ^ ), где предыдущий символ ― словесный (например, \w ), а следующий ― нет, либо наоборот, (например, это может быть начало строки или пробел).

\B ― соответствует несловообразующей границе. Соответствие не должно обнаруживаться на границе \b .

Обратные ссылки — \1

([abc])\1 \1 соответствует тексту из первой захватываемой группы -> тест([abc])([de])\2\1 можно использовать \2 (\3, \4, и т.д.) для определения порядкового номера захватываемой группы -> тест(? [abc])\k мы присвоили имя foo группе, и теперь ссылаемся на неё используя ― (\k ). Результат, как и в первом выражении -> тест

Опережающие и ретроспективные проверки — (?=) and (?<=)

d(?=r) соответствует d, только если после этого следует r, но r не будет входить в соответствие выражения -> тест(?r)d соответствует d, только если перед этим есть r, но r не будет входить в соответствие выражения -> тест

Вы можете использовать оператор отрицания !

d(?!r) соответствует d, только если после этого нет r, но r не будет входить в соответствие выражения -> тест(?r)d соответствует d, только если перед этим нет r, но r не будет входить в соответствие выражения -> тест

Заключение

Как вы могли убедиться, области применения регулярных выражений разнообразны. Я уверен, что вы сталкивались с похожими задачами в своей работе (хотя бы с одной из них), например такими:

  • Валидация данных (например, правильно ли заполнена строка time)
  • Сбор данных (особенно веб-скрапинг, поиск страниц, содержащих определённый набор слов в определённом порядке)
  • Обработка данных (преобразование сырых данных в нужный формат)
  • Парсинг (например, достать все GET параметры из URL или текст внутри скобок)
  • Замена строк (даже во время написания кода в IDE, можно, например преобразовать Java или C# класс в соответствующий JSON объект, заменить “;” на “,”, изменить размер букв, избегать объявление типа и т.д.)
  • Подсветка синтаксиса, переименование файла, анализ пакетов и многие другие задачи, где нужно работать со строками (где данные не должны быть текстовыми).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *