Регулярні вирази

«Пионеры, идите в жопу!»

Регуля́рные выраже́ния (regular expressions) — формальный язык для анализа и обработки текста по шаблону, состоящему из обычных символов, спецсимволов, метасимволов и квантификаторов.

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

, основанный на использовании метасимволов (символов-джокеров, англ. wildcard characters). Для поиска используется строка-образец (англ. pattern, по-русски её часто называют «шаблоном», «маской»), состоящая из символов и метасимволов и задающая правило поиска. Для манипуляций с текстом дополнительно задаётся строка замены, которая также может содержать в себе специальные символы.

Теория

Литералы

Шаблон - это строка произвольной длины, которая может содержать любые символы (литералы), означающие сами себя, за исключением  специальных символов [ ] \ / ^ $ . | ? * + ( ) { }

Для использования в шаблоне символа из числа специальных символов в качестве обычного символа его необходим экранировать обратным слешем \. Например: \[ \] \\ \/ \^ \$ \. \| \? \* \+ \( \) \{ \}. Можно экранировать целую последовательность символов, заключив её между \Q и \E.

Спецсимволы?

Спецсимволы выражают одиночные символы:
\a - символ колокольчика
\n — перевод строки
\r — возврат каретки
\t - символ табуляции
\v - символ вертикальной табуляции
\f - символ перевода страницы
\e - соответствует символу \u001B
\Ooo символ ASCII, заданный восьмеричным кодом, например: \040 соответствует символу пробела
\xHh символа заданного hex-кодом, например: \x8 соответствует \t, \x41 соответствует A
\cX Соответствует управляющему символу ASCII, где X — буква управляющего символа. Например, \cC означает CTRL-C.
\uHhhh Соответствует элементу кода UTF-16, значение которого является шестнадцатеричным значением nnnn. Примечание: Escape-символ Perl 5, используемый для указания Юникода, не поддерживается .NET. Escape-символ Perl 5 имеет форму \x{####…}, где ####… представляет собой ряд шестнадцатеричных цифр. Вместо этого используйте \unnnn.

Привязки

Привязки - атомарные утверждения нулевой ширины, которые указывают положение в строке, где должно быть найдено соответствие:

^  - соответствует началу текста или началу строки при многострочном модификаторе ?m
$ - спецсимвол конца текста или конца отдельной строки при многострочном модификаторе ?m
\A Соответствие должно находиться только в начале текста, как ^, но игнорирует многострочность модификатора ?m
\Z Соответствие должно находиться в конце строки или до символа \n в конце строки, как $, но игнорирует многострочность модификатора ?m
\z Соответствие должно находиться исключительно в конце строки, в отличие от языкового элемента \Z не сопоставляет символ \n в конце строки
\G привязка непрерывного совпадения, которое должно начинаться с позиции, в которой закончилось предыдущее совпадение, или если предыдущего совпадения еще не было, соответствует началу сопоставления
\b - любой граничный символ впереди или позади слова
\B - любой граничный символ самого слова в начале или конце

Конструкции группировки ЭТО КАКОЙ-ТО КОСМОС!

Символьные классы
Положительная группа символов
Отрицательная группа символов

Метасимволы начинаются с обратного слеша \, но выражают собой любой произвольный символ из некоторого набора:
\d соответствует ожиданию любой одиночной цифры
\D ожиданию любой одиночной нецифры
\w соответствует ожиданию любого алфавитно-цифрового символа
\W соответствует ожиданию любого не алфавитно-цифрового символа
. - метасимвол соответствует ожиданию любого одиночного символа, включая в том числе перевод каретки \r, но кроме новой строки \n,
\s соответствует любому пробельному символу [ \f\n\r\t\v]:
\S соответствует любому непробельному символу

\p{Z} Соответствует всем символам разделителя, включает категории Zs, Zl и Zp (категории Юникода см. в конце)

 

\p{Имя} - Категория Юникода или блок Юникода, соответствует любым символам, которые относятся к общей категории Юникода или именованному блоку, где name — сокращенное название категории или имя блока

[\p{IsCyrillic}] - НО ЭТО НЕ ТОЧНО.

\P{имя} - Отрицательная категория Юникода или блок Юникода, В стандарте Юникода каждому символу присваивается общая категория. Например, определенный символ может быть прописной буквой (категория Lu), десятичной цифрой (категория Nd), математическим символом (категория Sm) или разделителем абзацев (категория Zl)

[xyz] - положительная группа символов задает список символов, один из которых должен присутствовать во входной строке для успешного сопоставления

Символ ^ в набора метасимволов [^ ] означает исключение следующих символов из ожидаемых.

Вместо перечисления последовательных символов можно использовать диапазоны [A-Za-z].

[ -[]] вычитание класса символов, например: [A-z-[X]]

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

Квантификаторы

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

Жадная квантификация

В обычном случае квантификатор захватывает совпадением максимально разрешенное число символов.

?  ожидание только одного или ни одного символа
* Соответствует нулю или более раз.
+ Соответствует одному или нескольким разам.
? Соответствует нулю или одному разу.
{N} Соответствует ровно n раз.
{N,} Соответствует по крайней мере n раз.
{N,М} Совпадения от n до м раз.

Ленивая квантификация

Ленивый квантификатор захватывает минимально требуемое число символов, которое обеспечивает совпадение

*? Соответствует нулю или более раз.
+? Соответствует одному или нескольким разам.
?? Соответствует нулю или одному разу.
{N}? Соответствует ровно n раз.
{N,}? Соответствует по крайней мере n раз.
{N,М}? Совпадения от n до м раз.

Ревнивые квантификация (сверхжадная)

Ревнивая (possessive) квантификация не только старается найти максимально длинный вариант, но ещё и не позволяет алгоритму возвращаться к предыдущим шагам поиска для того, чтобы найти возможные соответствия для оставшейся части регулярного выражения. Использование ревнивых квантификаторов увеличивает скорость поиска, особенно в тех случаях, когда строка не соответствует регулярному выражению. Кроме того, ревнивые квантификаторы могут быть использованы для исключения нежелательных совпадений.

*+ Соответствует нулю или более раз.
++ Соответствует одному или нескольким разам.
?+ Соответствует нулю или одному разу.
{N}+ Соответствует ровно n раз.
{N,}+ Соответствует по крайней мере n раз.
{N,М}+ Совпадения от n до м раз.

Модификаторы

(?i) включает / (?-i) выключает нечувствительность выражения к регистру символов (англ. case insensitivity)
(?s) включает / (?-s) выключает режим соответствия точки символам переноса строки и возврата каретки
(?m) Символы ^ и $ вызывают соответствие только после и до символов новой строки
(?-m) с началом и концом текста
(?x) включает / (?-x) выключает режим без учёта пробелов между частями регулярного выражения и позволяет использовать # для комментариев

Нумерованные обратные ссылки

Нумерованная обратная ссылка использует следующий синтаксис:

\число

Флаги

Флаги определяют ...

  • Global (g) - свойство типа Булево определяет поиск во всем тексте, иначе до первого нахождения (по умолчанию: Ложь);
  • IgnoreCase (i) - свойство типа Булево определяет поиск без учета регистра, иначе с учетом (по умолчанию: Ложь);
  • Multiline (m) - свойство типа Булево определяет возможность поиска в многострочной строке, влияет на работу метасимволов ^ и $ (по умолчанию: Ложь);
  • Single (s) - текст трактуется как одна строка, в этом случае метасимволу . (точка) соответствует любой одиночный символ, включая символ новой строки
  • Unicode (u) - Выражение может содержать специальные паттерны, характерные для юникода, например, /\p{Lu}/ — заглавные буквы., вы можете использовать расширенные escape-последовательности Unicode в форме \u{FFFFF} или \x{FFFF}
  • Sticky (y) - Выражение будет соответствовать только своей позиции lastIndex и игнорирует глобальный флаг (g), если он установлен.

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

 

///

( ) - извлекаемый фрагмент информации для дальнейшей обработки, могут быть вложенными

 

///

Практика

///

RegExp

Система Windows предоставляет разработчикам com-объект VBScript.RegExp, поддерживающий работу с регулярным выражениями.

В составе объекта созданного обычными средствами доступны изменяемые свойства:

  • Global - свойство типа Булево определяет поиск во всем тексте, иначе до первого нахождения (по умолчанию: Ложь);
  • IgnoreCase - свойство типа Булево определяет поиск без учета регистра, иначе с учетом (по умолчанию: Ложь);
  • Multiline - свойство типа Булево определяет возможность поиска в многострочной строке, влияет на работу метасимволов ^ и $ (по умолчанию: Ложь);
  • Pattern - свойство типа Строка содержит шаблон регулярного выражения.

Метод .Test()

Test(СтрокаТекста). Метод проверяет переданную в параметре строку на соответствие шаблону (например проверка корректности адреса эл. почты). Возвращаемые значение: Ложь — строка соответствует шаблону, Истина — строка не соответствует шаблону;

Метод .Replace()

Replace(СтрокаТекста, СтрокаЗамены). Ищет соответствующие шаблону вхождения в первом параметре (СтрокаТекста) и заменяет их на значение второго параметра (СтрокаЗамены). Возвращаемые значения: измененный (возможно) параметр СтрокаТекста;

Метод .Execute()

Метод Execute(Строка) выполняет поиск в строке параметр подстрок соответствующих шаблону Pattern. Результатом выполнения метода является com-объект типа MatchCollection с коллекцией найденных соответствий. Объект коллекции MatchCollection предоставляет:

    • .Count - свойство типа Число содержит число найденных соответствий;
    • .Item(index) - метод возвращающий com-объект соответствия типа Match по заданному числовому индексу от 0.

Объект соответствия Match предоставляет:

      • .FirstIndex (Число) -  свойство содержит индекс начала соответствия в исходной строке
      • .Length (Число) - свойство содержит длину подстроки соответствия
      • .SubMatches (Коллекции строк) - содержит подстроки соответствия заданные шаблоном Pattern
      • .Value (Строка) - подстрока соответствия

///

JavaScript

Пример капитализации строки "abCD efg"->"AbCD Efg":

 

1С:Предприятие 8.x

Простой пример кода реализации разбора отдельных тегов в строке:

 

1С:Предприятие 7.7

Реализация

Исходный текст фрагмента Глобального модуля:

Пример использования:

Дополнения

Именованные блоки Юникода

0000 - 007F IsBasicLatin
0400 - 04FF IsCyrillic

Общие категории Юникода

Lu Буква: прописные буквы
Ll Letter, Lowercase
Lt Буква: заглавный регистр
Lm Буква: модификатор
Lo Буква: другие
L Все буквенные символы. Включает символы Lu, Ll, Lt, Lm и Lo
Mn Метка: не занимающая место
Mc Метка: комбинированная
Me Метка: вложенная
M Все объединяющие знаки. Включает категории Mn, Mc и Me.
Nd Число: десятичная цифра
Nl Число: буква
No Число: другое
N Все числа. Включает категории Nd, Nl и No.
Pc Пунктуация: соединитель
Pd Пунктуация: тире
Ps Пунктуация: открывающий знак пунктуации
Pe Пунктуация: закрывающий знак пунктуации
Pi Пунктуация: открывающая кавычка (в зависимости от использования поведение может быть аналогичным Ps или Pe)
Pf Пунктуация: закрывающая кавычка (в зависимости от использования поведение может быть аналогичным Ps или Pe)
Po Пунктуация: другие знаки пунктуации
P Все знаки препинания. Включает категории Pc, Pd, Ps, Pe, Pi, Pf и Po.
Sm Символ: математический
Sc Символ денежной единицы
Sk Символ: модификатор
So Символ: другие
S Все символы. Включает категории Sm, Sc, Sk и So.
Zs Разделитель: пробел
Zl Разделитель: строка
Zp Разделитель: абзац
Z Все знаки разделения. Включает категории Zs, Zl и Zp.
Cc Другое: управляющий символ
Cf Другое: формат
Cs Другое: заменяющий символ
Co Другое: индивидуальное использование
Cn Другое, не назначенное или нехарактерное
C Все остальные символы. Включает категории Cc, Cf, Cs, Co и Cn.

Leave a Reply