Foreversoft.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

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

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

Это не новая технология, изначально она появилась в среде UNIX и обычно используется в языке программирования Perl. Разработчики из Microsoft перенесли ее в Windows, где до недавнего времени эта технология применялась в основном со сценарными языками. Однако теперь регулярные выражения поддерживаются множеством классов .NET из пространства имен System.Text.RegularExpressions. Случаи применения регулярных выражений можно встретить во многих частях среды .NET Framework. В частности, вы найдете их в серверных элементах управления проверкой ASP.NET.

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

Язык регулярных выражений предназначен специально для обработки строк. Он включает два средства:

Набор управляющих кодов для идентификации специфических типов символов

Система для группирования частей подстрок и промежуточных результатов таких действий

С помощью регулярных выражений можно выполнять достаточно сложные и высокоуровневые действия над строками:

Идентифицировать (и возможно, помечать к удалению) все повторяющиеся слова в строке

Сделать заглавными первые буквы всех слов

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

Обеспечить правильную капитализацию предложений

Выделить различные элементы в URI (например, имея http://www.professorweb.ru, выделить протокол, имя компьютера, имя файла и т.д.)

Главным преимуществом регулярных выражений является использование метасимволов — специальные символы, задающие команды, а также управляющие последовательности, которые работают подобно управляющим последовательностям C#. Это символы, предваренные знаком обратного слеша () и имеющие специальное назначение.

В следующей таблице специальные метасимволы регулярных выражений C# сгруппированы по смыслу:

Метасимволы, используемые в регулярных выражениях C#

СимволЗначениеПримерСоответствует
Классы символов
[. ]Любой из символов, указанных в скобках[a-z]В исходной строке может быть любой символ английского алфавита в нижнем регистре
[^. ]Любой из символов, не указанных в скобках[^0-9]В исходной строке может быть любой символ кроме цифр
.Любой символ, кроме перевода строки или другого разделителя Unicode-строки
wЛюбой текстовый символ, не являющийся пробелом, символом табуляции и т.п.
WЛюбой символ, не являющийся текстовым символом
sЛюбой пробельный символ из набора Unicode
SЛюбой непробельный символ из набора Unicode. Обратите внимание, что символы w и S — это не одно и то же
dЛюбые ASCII-цифры. Эквивалентно [0-9]
DЛюбой символ, отличный от ASCII-цифр. Эквивалентно [^0-9]
Символы повторения
Соответствует предшествующему шаблону, повторенному не менее n и не более m разs

«Press», «ssl», «progressss»
Соответствует предшествующему шаблону, повторенному n или более разs

«ssl»
Соответствует в точности n экземплярам предшествующего шаблонаs

«Press», «ssl», но не «progressss»
?Соответствует нулю или одному экземпляру предшествующего шаблона; предшествующий шаблон является необязательнымЭквивалентно
+Соответствует одному или более экземплярам предшествующего шаблонаЭквивалентно
*Соответствует нулю или более экземплярам предшествующего шаблонаЭквивалентно
Символы регулярных выражений выбора
|Соответствует либо подвыражению слева, либо подвыражению справа (аналог логической операции ИЛИ).
(. )Группировка. Группирует элементы в единое целое, которое может использоваться с символами *, +, ?, | и т.п. Также запоминает символы, соответствующие этой группе для использования в последующих ссылках.
(. )Только группировка. Группирует элементы в единое целое, но не запоминает символы, соответствующие этой группе.
Якорные символы регулярных выражений
^Соответствует началу строкового выражения или началу строки при многострочном поиске.^Hello«Hello, world», но не «Ok, Hello world» т.к. в этой строке слово «Hello» находится не в начале
$Соответствует концу строкового выражения или концу строки при многострочном поиске.Hello$«World, Hello»
bСоответствует границе слова, т.е. соответствует позиции между символом w и символом W или между символом w и началом или концом строки.b(my)bВ строке «Hello my world» выберет слово «my»
BСоответствует позиции, не являющейся границей слов.B(ld)bСоответствие найдется в слове «World», но не в слове «ld»

Использование регулярных выражений в C#

Безуcловно, задачу поиска и замены подстроки в строке можно решить на C# с использованием различных методов System.String и System.Text.StringBuilder. Однако в некоторых случаях это потребует написания большого объема кода C#. Если вы используете регулярные выражения, то весь этот код сокращается буквально до нескольких строк. По сути, вы создаете экземпляр объекта RegEx, передаете ему строку для обработки, а также само регулярное выражение (строку, включающую инструкции на языке регулярных выражений) — и все готово.

В следующей таблице показана часть информации о перечислении RegexOptions, экземпляр которого можно передать конструктору класса RegEx:

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

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

После создания шаблона регулярного выражения с ним можно осуществить различные действия, в зависимости от того, что вам необходимо. Можно просто проверить, существует ли текст, соответствующий шаблону, в исходной строке. Для этого нужно использовать метод IsMatch(), который возвращает логическое значение:

Если нужно вернуть найденное соответствие из исходной строки, то можно воспользоваться методом Match(), который возвращает объект класса Match, содержащий сведения о первой подстроке, которая сопоставлена шаблону регулярного выражения. В этом классе имеется свойство Success, которое возвращает значение true, если найдено следующее совпадение, которое можно получить с помощью вызова метода Match.NextMatch(). Эти вызовы метода можно продолжать пока свойство Match.Success не вернет значение false. Например:

Извлечь все совпадения можно и более простым способом, используя метод Regex.Matches(), который возвращает объект класса MatchCollection, который, в свою очередь, содержит сведения обо всех совпадениях, которые обработчик регулярных выражений находит во входной строке. Например, предыдущий пример может быть переписан для вызова метода Matches вместо метода Match и метода NextMatch:

Наконец, можно не просто извлекать совпадения в исходной строке, но и заменять их на собственные значения. Для этого используется метод Regex.Replace(). В качестве замены методу Replace() можно передавать как строку, так и шаблон замены. В следующей таблице показано как формируются метасимволы для замены:

Метасимволы замены в регулярных выражениях C#

СимволОписаниеПример шаблонаПример шаблона заменыРезультат (входная -> результирующая строки)
$ numberЗамещает часть строки, соответствующую группе numberb(w+)(s)(w+)b$3$2$1«один два» -> «два один»
$$Подставляет литерал «$»b(d+)s?USD$$$1«103 USD» -> «$103»
$&Замещает копией полного соответствия($*(d*(.+d+)?)<1>)**$&«$1.30» -> «**$1.30**»
$`Замещает весь текст входной строки до соответствияB+$`«AABBCC» -> «AAAACC»
$’Замещает весь текст входной строки после соответствияB+$’«AABBCC» -> «AACCCC»
$+Замещает последнюю захваченную группуB+(C+)$+«AABBCCDD» -> «AACCDD»
$_Замещает всю входную строкуB+$_«AABBCC» -> «AAAABBCCCC»

Давайте рассмотрим метод Regex.Replace() на примере:

Для закрепления темы давайте рассмотрим еще один пример использования регулярных выражений, где будем искать в исходном тексте слово «сериализация» и его однокоренные слова, при этом выделяя в консоли их другим цветом:

Результат работы данной программы:

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

C# Regex в примерах

Перевод статьи подготовлен специально для студентов курса «Разработчик С#».

Класс Regex реализует регулярные выражения в C#. В этой статье вы узнаете, как использовать C# Regex для проверки различных пользовательских входных данных.

Regex в C# реализует регулярные выражения. Класс C# Regex предлагает методы и свойства для анализа большого текста, с целью поиска шаблонов символов. В этой статье вы узнаете, как использовать класс .NET Regex в C#.

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

Регулярное выражение используется для проверки соответствия строки шаблону. Регулярное выражение (regular expression или regex, или regexp) — это последовательность символов, которая определяет шаблон. Шаблон может состоять из литералов, чисел, символов, операторов или конструкций. Шаблон используется для поиска соответствий в строке или файле.
Регулярные выражения часто используются при проверке входных данных, анализе и поиске строк. Например, проверка достоверной даты рождения, номера социального страхования, полного имени, в котором имя и фамилия разделены запятой, поиск числа вхождений подстроки, замена подстрок, форматов даты, допустимых форматов электронной почты, формата валюты, и так далее.

Класс Regex

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

Класс Regex определен в пространстве имен System.Text.RegularExpressions. Конструктор класса Regex принимает в качестве параметра строку шаблона вместе с другими необязательными параметрами.

Следующий фрагмент кода создает регулярное выражение из шаблона. Здесь шаблон соответствует слову, начинающемуся с буквы «M».

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

Метод Matches используется для поиска всех совпадений в регулярном выражении и возвращает MatchCollection.

Следующий фрагмент кода проходит по коллекции совпадений.

В приведенном выше примере код ищет символ «M». Но что, если слово начинается с «м». Следующий фрагмент кода использует параметр RegexOptions.IgnoreCase , для того, чтобы Regex не обращал внимания на регистр.

Замена множественных пробелов с помощью Regex

Метод Regex.Replace() используется для замены совпавшей строки новой строкой. В следующем примере выполняется поиск множественных пробелов в строке с заменой на единичный.

Следующий фрагмент кода заменяет пробелы на ‘-‘.

Разбиение строки на символы с помощью Regex

В следующем примере шаблон регулярного выражения [a-z] + и метод Regex.Split() используются для разделения строки на символы без учета их регистра.

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

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

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

Вот подробное объяснение регулярных выражений и их использования в C# и .NET:
Регулярные выражения в C#

Regex для проверки электронной почты

Для проверки множества адресов электронной почты мы можем использовать следующие регулярные выражения. Мы разделяем адреса с помощью разделителя ‘;’

Если вы хотите использовать разделитель ‘,’, то используйте следующее

и если вы хотите использовать оба разделителя ‘,’ и ‘;’ то используйте это

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

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

В этой статье объясняется, как использовать регулярные выражения (класс Regex пространства имен System.Text.RegularExpressions) в C# и .NET.

Мы можем использовать метод Regex.Match, который принимает входные данные и регулярное выражение, и возвращает success, если

Разделить строку с помощью Regex.split(регулярное выражение) в C#

В этой части мы узнаем, как разбивать строку, используя RegEx в C#. Regex разбивает строку на основе шаблона. Он обрабатывает разделитель, указанный в качестве шаблона. Вот почему Regex лучше, чем string.Split. Вот несколько примеров того, как разбить строку, используя Regex в C#. Давайте напишем код.

Для использования Regex для разбиения строки нужно добавить следующие пространства имен.

Отделить цифры от строк с помощью Regex.

Приведенный выше код разбивает строку, используя D+, и выводит цифры посредством итерации по результату.

Узнайте больше можно здесь:

Заменить специальные символы из строки с помощью Regex

В этой части я расскажу вам о том, как заменить специальные символы с помощью регулярных выражений в C#.

Если у вас есть строка со специальными символами и вы хотите удалить или заменить их, вы можете использовать для этого регулярное выражение.

Используйте следующий код:

Этот код удалит все специальные символы, но если вы не хотите удалять некоторые специальные символы, например, запятую «,» и двоеточие «:» — внесите следующие изменения:

Точно так же вы можете вносить изменения в соответствии с вашими требованиями.

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

Для дальнейшего прочтения

Если вы новичок в регулярных выражениях, я рекомендую прочитать эту статью «Введение в регулярные выражения».

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

Классы StringBuilder и String предоставляют достаточную функциональность для работы со строками. Однако .NET предлагает еще один мощный инструмент — регулярные выражения. Регулярные выражения представляют эффективный и гибкий метод по обработке больших текстов, позволяя в то же время существенно уменьшить объемы кода по сравнению с использованием стандартных операций со строками.

Основная функциональность регулярных выражений в .NET сосредоточена в пространстве имен System.Text.RegularExpressions . А центральным классом при работе с регулярными выражениями является класс Regex. Например, у нас есть некоторый текст и нам надо найти в нем все словоформы какого-нибудь слова. С классом Regex это сделать очень просто:

Здесь мы находим в искомой строке все словоформы слова «туп». В конструктор объекта Regex передается регулярное выражение для поиска. Далее мы разберем некоторые элементы синтаксиса регулярных выражений, а пока достаточно знать, что выражение туп(w*) обозначает, найти все слова, которые имеют корень «туп» и после которого может стоять различное количество символов. Выражение w означает алфавитно-цифровой символ, а звездочка после выражения указывает на неопределенное их количество — их может быть один, два, три или вообще не быть.

Метод Matches класса Regex принимает строку, к которой надо применить регулярные выражения, и возвращает коллекцию найденных совпадений.

Каждый элемент такой коллекции представляет объект Match . Его свойство Value возвращает найденное совпадение.

Параметр RegexOptions

Класс Regex имеет ряд конструкторов, позволяющих выполнить начальную инициализацию объекта. Две версии конструкторов в качестве одного из параметров принимают перечисление RegexOptions . Некоторые из значений, принимаемых данным перечислением:

Compiled : при установке этого значения регулярное выражение компилируется в сборку, что обеспечивает более быстрое выполнение

CultureInvariant : при установке этого значения будут игнорироваться региональные различия

IgnoreCase : при установке этого значения будет игнорироваться регистр

IgnorePatternWhitespace : удаляет из строки пробелы и разрешает комментарии, начинающиеся со знака #

Multiline : указывает, что текст надо рассматривать в многострочном режиме. При таком режиме символы «^» и «$» совпадают, соответственно, с началом и концом любой строки, а не с началом и концом всего текста

RightToLeft : приписывает читать строку справа налево

Singleline : устанавливает однострочный режим, а весь текст рассматривается как одна строка

При необходимости можно установить несколько параметров:

Синтаксис регулярных выражений

Рассмотрим вкратце некоторые элементы синтаксиса регулярных выражений:

^ : соответствие должно начинаться в начале строки (например, выражение @»^прw*» соответствует слову «привет» в строке «привет мир»)

$ : конец строки (например, выражение @»w*ир$» соответствует слову «мир» в строке «привет мир», так как часть «ир» находится в самом конце)

. : знак точки определяет любой одиночный символ (например, выражение «м.р» соответствует слову «мир» или «мор»)

* : предыдущий символ повторяется 0 и более раз

+ : предыдущий символ повторяется 1 и более раз

? : предыдущий символ повторяется 0 или 1 раз

s : соответствует любому пробельному символу

S : соответствует любому символу, не являющемуся пробелом

w : соответствует любому алфавитно-цифровому символу

W : соответствует любому не алфавитно-цифровому символу

d : соответствует любой десятичной цифре

D : соответствует любому символу, не являющемуся десятичной цифрой

Это только небольшая часть элементов. Более подробное описание синтаксиса регулярных выражений можно найти на msdn в статье Элементы языка регулярных выражений — краткий справочник.

Теперь посмотрим на некоторые примеры использования. Возьмем первый пример с скороговоркой «Бык тупогуб, тупогубенький бычок, у быка губа бела была тупа» и найдем в ней все слова, где встречается корень «губ»:

Так как выражение w* соответствует любой последовательности алфавитно-цифровых символов любой длины, то данное выражение найдет все слова, содержащие корень «губ».

Второй простенький пример — нахождение телефонного номера в формате 111-111-1111:

Если мы точно знаем, сколько определенных символов должно быть, то мы можем явным образом указать их количество в фигурных скобках: d <3>— то есть в данном случае три цифры.

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

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

Также можно задать диапазон для алфавитных символов: Regex regex = new Regex(«[a-v]<5>«); — данное выражение будет соответствовать любому сочетанию пяти символов, в котором все символы находятся в диапазоне от a до v.

Можно также указать отдельные значения: Regex regex = new Regex(@»[2]*-[0-9]<3>-d<4>«); . Это выражение будет соответствовать, например, такому номеру телефона «222-222-2222» (так как первые числа двойки)

С помощью операции | можно задать альтернативные символы: Regex regex = new Regex(@»[2|3]<3>-[0-9]<3>-d<4>«); . То есть первые три цифры могут содержать только двойки или тройки. Такой шаблон будет соответствовать, например, строкам «222-222-2222» и «323-435-2318». А вот строка «235-435-2318» уже не подпадает под шаблон, так как одной из трех первых цифр является цифра 5.

Итак, у нас такие символы, как *, + и ряд других используются в качестве специальных символов. И возникает вопрос, а что делать, если нам надо найти, строки, где содержится точка, звездочка или какой-то другой специальный символ? В этом случае нам надо просто экранировать эти символы слешем:

Проверка на соответствие строки формату

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

Переменная pattern задает регулярное выражение для проверки адреса электронной почты. Данное выражение предлагает нам Microsoft на страницах msdn.

Для проверки соответствия строки шаблону используется метод IsMatch: Regex.IsMatch(email, pattern, RegexOptions.IgnoreCase) . Последний параметр указывает, что регистр можно игнорировать. И если введенная строка соответствует шаблону, то метод возвращает true .

Замена и метод Replace

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

Данная версия метода Replace принимает два параметра: строку с текстом, где надо выполнить замену, и сама строка замены. Так как в качестве шаблона выбрано выражение «s+ (то есть наличие одного и более пробелов), метод Replace проходит по всему тексту и заменяет несколько подряд идущих пробелов ординарными.

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

Как и обещал, выкладываю свой FAQ по Regex для тех кто только начинает с ним знакомиться. По мере углубления своих знаний готов продолжить работу над ним. Если администрации он покажется полезным то можно вынести тему наверх. Надеюсь что кому-то он поможет, мне бы, во всяком случае, для старта он очень пригодился бы.

Читать еще:  Массивы си шарп
Ссылка на основную публикацию
Adblock
detector