Регулярные выражения си шарп
Регулярные выражения в C#
Регулярные выражения — это часть небольшой технологической области, невероятно широко используемой в огромном диапазоне программ. Регулярные выражения можно представить себе как мини-язык программирования, имеющий одно специфическое назначение: находить подстроки в больших строковых выражениях.
Это не новая технология, изначально она появилась в среде UNIX и обычно используется в языке программирования Perl. Разработчики из Microsoft перенесли ее в Windows, где до недавнего времени эта технология применялась в основном со сценарными языками. Однако теперь регулярные выражения поддерживаются множеством классов .NET из пространства имен System.Text.RegularExpressions. Случаи применения регулярных выражений можно встретить во многих частях среды .NET Framework. В частности, вы найдете их в серверных элементах управления проверкой ASP.NET.
Введение в регулярные выражения
Язык регулярных выражений предназначен специально для обработки строк. Он включает два средства:
Набор управляющих кодов для идентификации специфических типов символов
Система для группирования частей подстрок и промежуточных результатов таких действий
С помощью регулярных выражений можно выполнять достаточно сложные и высокоуровневые действия над строками:
Идентифицировать (и возможно, помечать к удалению) все повторяющиеся слова в строке
Сделать заглавными первые буквы всех слов
Преобразовать первые буквы всех слов длиннее трех символов в заглавные
Обеспечить правильную капитализацию предложений
Выделить различные элементы в URI (например, имея http://www.professorweb.ru, выделить протокол, имя компьютера, имя файла и т.д.)
Главным преимуществом регулярных выражений является использование метасимволов — специальные символы, задающие команды, а также управляющие последовательности, которые работают подобно управляющим последовательностям 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:
Член | Описание |
---|---|
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() можно передавать как строку, так и шаблон замены. В следующей таблице показано как формируются метасимволы для замены:
Символ | Описание | Пример шаблона | Пример шаблона замены | Результат (входная -> результирующая строки) |
---|---|---|---|---|
$ number | Замещает часть строки, соответствующую группе number | b(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 для тех кто только начинает с ним знакомиться. По мере углубления своих знаний готов продолжить работу над ним. Если администрации он покажется полезным то можно вынести тему наверх. Надеюсь что кому-то он поможет, мне бы, во всяком случае, для старта он очень пригодился бы.