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

Приветствую всех, сегодня хотел поговорить о регулярных выражения. Регулярные выражения появились очень давно, но посей день широко используются в программировании. Это на столько эффективный способ обработки текста, что позволяет без труда анализировать большие объемы текста, символов, или заданного шаблона поиска. Для приложений использующих большие тексты, регулярные выражения просто не заменимы!

Основа обработки текста с помощью регулярных выражений — это подсистема обработки регулярных выражений, представленная в платформе .NET Framework объектом System.Text.RegularExpressions.Regex. Минимальный набор сведений, который требуется предоставить подсистеме обработки регулярных выражений для обработки текста, сводится к: созданию шаблона регулярного выражения и применение его к анализируемому тексту.

Методы класса Regex, позволяют определить, встречается ли во входном тексте шаблон регулярного выражения. Для этого можно использовать метод IsMatch. Также
можно извлечь из текста одно или все вхождения, соответствующие шаблону регулярного выражения, путем вызова метода Match или Matches. Первый метод возвращает объект Match, предоставляющий сведения о совпадении в тексте. Второй метод возвращает коллекцию MatchCollection, в которую входят объекты Match для всех совпадений, найденных в проанализированном тексте.

Заменить текст, соответствующий шаблону регулярного выражения, можно путем вызова метода Replace.

IsMatch — метод возвращающий bool. True — в случае, если шаблон соответствует строке или false — в противном случае. Метод IsMatch — сравнивает принимаемую в первом параметре строку с шаблоном.

При проверке вводимых данных рекомендуется начинать регулярные выражения с символа «^» и заканчивать их символом «$». Это гарантирует проверку строки, точно соответствующей заданному шаблону, а не просто содержащей его.

Метасимволы:

Символ Значение Пример Соответствует
Классы символов
[…] Любой из символов, указанных в скобках [a-z] В исходной строке может быть любой символ английского алфавита в нижнем регистре
[^…] Любой из символов, не указанных в скобках [^0-9] В исходной строке может быть любой символ кроме цифр
. Любой символ, кроме переноса строки \n Любой единичный символ
\w Буква, цифра или знак нижнего подчёркивания, «Словесный» символ (все буквы, цифры и подчеркивание (‘_’))
\W Не: буква, цифра или знак нижнего подчёркивания, Все, кроме символов, определяемых метасимволом \w
\s Указывает что символом будет пробел Пустой символ (пробел и табуляция)
\S Любой не пробельный символ из набора Unicode. Непустой символ (все, кроме символов, определяемых метасимволом \s)
\d Определяет символ цифры. Эквивалентно [0-9] цифры от 0-9
\D Любой символ который не является цифрой. Эквивалентно [^0-9] Не цифра (любой символ кроме символов 0-9)
\n Перевод строки.
\t Горизонтальная табуляция
\v Вертикальная табуляция
\f Конец страницы
\b Литерал «забой» внутри символьного класса. Вне символьного класса это метасимвол границы слова. Символ на границе слова (в начале или в конце)
\0 Литерал«NULL» (пустой символ).

Экранирование

Чтобы использовать метасимвол, как литерал, его нужно экранировать обратным слэшем.

 

Позиционные метасимволы
^ Этот метасимвол означает позицию начала текста. Если регулярное выражение используется с флагом MULTILINE, то этот метасимвол указывает на позицию начала строки многострочного текста. ^Hello «Hello, world», но не «Ok, Hello world» т.к. в этой строке слово «Hello» находится не в начале
$ Этот метасимвол означает позицию конца текста. Если регулярное выражение используется с флагом MULTILINE, то этот метасимвол указывает на позицию конца строки многострочного текста. Hello$ «World, Hello»
\b Граница слова. Словом считаются буквенные литералы, цифры и нижнее подчёркивание, идущие подряд. Границы слова, соответственно, находятся слева и справа от слова. \b(my)\b В строке «Hello my world» выберет слово «my»
\B Соответствует позиции, не являющейся границей слов. \B(ld)\b Соответствие найдется в слове «World», но не в слове «ld»
\G Позиция конца предыдущего совпадения. Если текущее совпадение — первое, то это позиция начала текста.

 

Кванторы

Это символы которые определяют, где и сколько раз необходимо вхождения символов в шаблон строки.
Квантификатор Описание Шаблон Число соответствий
* Любое количество совпадений или их отсутствие. То же самое, что и ({0,}) \d*\.\d «.0», «19.9», «219.9»
+ Как минимум одно повторение. То же самое, что и ({1,}) «be+» «bee» в «been», «be» в «bent»
? Количество совпадений 0 или 1. То же самое, что и {0,1}. «rai?n» «ran», «rain»
{n} Предыдущий элемент повторяется ровно n раз. «,\d{3}» «,043» в «1,043.6», «,876», «,543» и «,210» в «9,876,543,210»
{n,} Предыдущий элемент повторяется как минимум n раз. «\d{2,}» «166», «29», «1930»
{n,м} Совпадения от n до m включительно. «\d{3,5}» «166», «17668»

«19302» в «193024»

*? Предыдущий элемент не повторяется вообще или повторяется, но как можно меньшее число раз. \d*?\.\d «.0», «19.9», «219.9»
+? Предыдущий элемент повторяется один или несколько раз, но как можно меньшее число раз. «be+?» «be» в «been», «be» в «bent»
?? Предыдущий элемент не повторяется или повторяется один раз, но как можно меньшее число раз. «rai??n» «ran», «rain»
{n}? Предыдущий элемент повторяется ровно n раз. «,\d{3}?» «,043» в «1,043.6», «,876», «,543» и «,210» в «9,876,543,210»
{n,}? Предыдущий элемент повторяется как минимум n раз (как можно меньше). «\d{2,}?» «166», «29», «1930»
{n,м}? Предыдущий элемент повторяется не менее n и не более m раз (как можно меньше). «\d{3,5}?» «166», «17668»

«193», «024» в «193024»

 

Перечисление флагов RegexOptions позволяет настраивать поведение сопостав­ления.

Структура перечисления RegexOptions 

Член Описание
CultureInvariant Предписывает игнорировать национальные установки строки
ExplicitCapture Модифицирует способ поиска соответствия, обеспечивая только буквальное соответствие
IgnoreCase Игнорирует регистр символов во входной строке
IgnorePatternWhitespace Удаляет из строки не защищенные управляющими символами пробелы и разрешает комментарии, начинающиеся со знака фунта или хеша
Multiline Изменяет значение символов ^ и $ так, что они применяются к началу и концу каждой строки, а не только к началу и концу всего входного текста
RightToLeft Предписывает читать входную строку справа налево вместо направления по умолчанию — слева направо (что удобно для некоторых азиатских и других языков, которые читаются в таком направлении)
Singleline Специфицирует однострочный режим, в котором точка (.) символизирует соответствие любому символу

Группы и просмотр

Все регулярные выражения для общего понимания можно представить так :

 

 

Распространенным применением RegexOptions является выполнение поиска, нечувствительного к регистру символов:

ще одним полезным флагом является IgnorePatternWhi tespace или ( ?х). Он позволяет вставлять пробельные символы, чтобы улучшить читабельность регулярно­го выражения — без трактовки этих символов литеральным образом.

Методы класса Regex позволяют выполнять следующие операции:

Определить, встречается ли шаблон регулярного выражения во входном тексте, с помощью вызова метода Regex.IsMatch.

 

Получить один или все экземпляры текста, соответствующего шаблону регулярного выражения с помощью метода Regex.Match или Regex.Matches. Первый метод возвращает объект System.Text.RegularExpressions.Match, который предоставляет сведения о соответствующем тексте. Второй метод возвращает объект MatchCollection, содержащий один объект System.Text.RegularExpressions.Match для каждого соответствия, обнаруженного в обработанном тексте.

Заменить текст, соответствующий шаблону регулярного выражения, с помощью метода Regex.Replace:

Именованные группы

В длинном или сложном выражении работать с группами удобнее по именам, а не по индексам. Ниже приведен переписанный предыдущий пример, в котором приме­няется группа по имени ‘letter’:

Замена и разделение текста

Метод RegEx. Replace работает подобно string. Replace за исключением того, что использует регулярное выражение.

Меняем кошку на собаку.

Разделение текста

Статический метод Regex. Spli t — это более мощная версия метода string. Split с реrулярным выражением, обозначающим шаблон разделителя. В следующем приме­ре мы разделяем строку, в которой любая цифра считается разделителем:

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

Группы

Шаблон регулярное выражение, которое представляет телефонные номера в CIIIA, такие как 206-465-1918:

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

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

Шаблон на ввод логина, позволяет осуществить поиск и исключить все знаки, оставив только буквы анг и рус и цифры.

Шаблон поиск внутри большой строки:

Шаблон проверки сложности паролей:
Следующий код проверяет, что пароль состоит, по меньшей мере, из шести символов и включает цифру, символ или знак пунктуации:

Шаблон Разбор даты/времени:

Это выражение поддерживает разнообразные числовые форматы даты и работаетнезависимо от того, где указан год — в начале или конце. Директива ( ?х) улучшает читабельность, разрешая применение пробельных символов; директива ( ? i) отклю­чает чувствительность к регистру символов (для необязательного указателя АМ/РМ). Затем к компонентам совпадения можно обращаться через коллекцию Groups:

Шаблон проверки соответствие римским числам:

Шаблон удаление повторяющихся слов:

Здесь мы захватываем именованную группу dupe:

Шаблон подсчет слов:

Шаблон преобразование символов в строке запроса НTTР:

Шаблон разбор поисковых терминов Google из журнаnа веб-статистики:

Это должно использоваться в сочетании с предыдущим примером преобразования символов в строке запроса:

Шаблон поиска ссылок в HTML странице:

Шаблон нахождения номера телефона начинающегося с +7

Еще один пример:

Шаблон проверки правильности ввода email

Шаблон позволяющий найти EMAIL в HTML странице:

Шаблон позволяющий заменить в тексте все предлоги состоящие из 2 символов, названием сайта:

Шаблон позволяющий заменить в тексте, табуляцию \t , перевод строки \n, возврат каретки \r , а так же все цифры и набор символов, на пробел

 

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

Скачать Regular.png

 

 

Обновлено: 25.11.2018 — 00:00

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.