«Пионеры, идите в жопу!»
Регуля́рные выраже́ния (regular expressions) — формальный язык для анализа и обработки текста по шаблону, состоящему из обычных символов, спецсимволов, метасимволов и квантификаторов.
- Регулярные выражения на //ru.wikipedia.org
- Regular Expression Toolkit //regex101.com
- RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp) //regexr.com
- Классы символов в регулярных выражениях на //docs.microsoft.com/ru-ru/
- Руководство JavaScript>Регулярные выражения //developer.mozilla.org
- RegexOne: Learn Regular Expressions with simple, interactive exercises //regexone.com
- Хабр:Визуальный генератор регулярных выражений на //habr.com
- Генератор Правил Валидации //uiregex.com/ru
Регулярные выражения
, основанный на использовании метасимволов (символов-джокеров, англ. 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), если он установлен.
Способ применение и обработки флагов может отличаться в различных реализациях. Флаги могут добавляться к шаблону, который обрамляется слешами:
1 |
/.../gimu |
///
( ) - извлекаемый фрагмент информации для дальнейшей обработки, могут быть вложенными
///
Практика
///
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 2 3 |
function capitalize(s) { s.replace(/(^|\s)\S/g, function(c) {return c.toUpperCase()}) } |
1С:Предприятие 8.x
Простой пример кода реализации разбора отдельных тегов в строке:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Процедура RegExpExecute() RegExp = Новый COMОбъект("VBScript.RegExp"); RegExp.IgnoreCase = Ложь; RegExp.Global = Истина; RegExp.MultiLine = Ложь; RegExp.Pattern = "<[^>]*>"; Matches=RegExp.Execute("Тестовая <hr> строка <br> с HTML тегами"); Для С = 0 По Matches.Count()-1 Цикл Match = Matches.Item(С); Сообщить(Match.Value); КонецЦикла; КонецПроцедуры |
1С:Предприятие 7.7
Реализация
Исходный текст фрагмента Глобального модуля:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
Перем ОбъектРегЭксп; ... //============================================================================== // Функция: РегулярныйПоиск (мультистрока, паттерн, найтиВсе=1, многострочный=1, игнорироватьРегистр=1) // Реализует поиск регулярных выражений через вызов системного объекта RegExp // Параметры: // мультистрока - строка/текст для поиска // паттерн - шаблон поиска регулярных выражений // найтиВсе=1, многострочный=1, игнорироватьРегистр=1 - параметры вызова поиска // Возврат: ТаблицаЗначений с набором найденных выражений с колонками: // .Индекс - индекс начала найденного выражения // .Длина - длина найденного выражения // .Значение - значение найденного выражения // .Суб<0..n> - подстроки возвращаемые выражением // Функция РегулярныйПоиск (мультистрока, паттерн, найтиВсе=1, многострочный=1, игнорироватьРегистр=1) Экспорт // ОбъектРегЭксп.Global = найтиВсе; ОбъектРегЭксп.MultiLine = многострочный; ОбъектРегЭксп.IgnoreCase = игнорироватьРегистр; // ОбъектРегЭксп.Pattern = паттерн; Попытка наборВыражений = ОбъектРегЭксп.Execute (мультистрока); всегоНайдено = наборВыражений.Count(); // таблицаВыражений = СоздатьОбъект ("ТаблицаЗначений"); таблицаВыражений.НоваяКолонка("Индекс", "Число"); таблицаВыражений.НоваяКолонка("Длина", "Число"); таблицаВыражений.НоваяКолонка("Значение", "Строка"); // Если всегоНайдено > 0 Тогда Для индекс = 0 По всегоНайдено - 1 Цикл выражение = наборВыражений.Item (индекс); таблицаВыражений.НоваяСтрока(); таблицаВыражений.Индекс = выражение.FirstIndex + 1; таблицаВыражений.Длина = выражение.Length; таблицаВыражений.Значение = выражение.Value; // подстроки = выражение.SubMatches; Для индексПодстроки = 0 По подстроки.Count-1 Цикл Если таблицаВыражений.КоличествоКолонок() < индексПодстроки + 4 Тогда таблицаВыражений.НоваяКолонка("Суб"+Строка(индексПодстроки), "Строка"); КонецЕсли; таблицаВыражений.УстановитьЗначение (таблицаВыражений.КоличествоСтрок(), индексПодстроки + 4, подстроки.Item(индексПодстроки)); КонецЦикла; КонецЦикла; КонецЕсли; // Возврат таблицаВыражений; // Исключение КонецПопытки; // Возврат ПолучитьПустоеЗначение(); КонецФункции ... ОбъектРегЭксп = CreateObject("VBScript.RegExp"); |
Пример использования:
1 2 |
подстроки = РегулярныйПоиск ("...", "\s?([\wА-Яа-яЁё]+)\s?(.*)"); ... |
Дополнения
Именованные блоки Юникода
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.