1.05M
Category: programmingprogramming

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

1.

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

2.

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

3.

Регулярные выражения
• С помощью регулярных выражений удобно обрабатывать
файлы в формате HTML, файлы журналов или длинные
текстовые файлы.
• Основная функциональность регулярных выражений в
библиотеке .NET сосредоточена в пространстве имен
System.Text.RegularExpressions.
• Центральным классом при работе с регулярными
выражениями является класс Regex.
3

4.

Регулярные выражения
• это шаблон (образец), по которому выполняется
поиск соответствующего ему фрагмента текста.
• язык описания регулярных выражений состоит из
символов двух видов: обычных и метасимволов.
Обычный символ в выражении представляет сам
себя, а метасимвол – некоторый класс символов,
например любую цифру или букву.
4

5.

Регулярные выражения
• Например, регулярное выражение для поиска в
тексте фрагмента «Вася» записывается с помощью
четырех обычных символов Вася, а выражение для
поиска двух цифр, идущих подряд, состоит из
метасимволов \d\d.
• С помощью комбинаций метасимволов можно
описывать сложные шаблоны для поиска
(шаблоны для IP-адреса, адреса электронной
почты, различных форматов даты и т.д.).
5

6.

Метасимволы:
• Метасимволы представляющие собой классы
символов.
• Метасимволы уточняющие позицию в строке, в
которой следует искать совпадение с регулярным
выражением (являются мнимыми, т.е. в тексте им
не соответствует никакой реальный символ).
• Метасимволы – повторители.
6

7.

Классы символов
Метасимвол
.
[]
Описание
Любой символ, кроме \n
Пример
Выражение c.t соответствует
фрагментам cat, cut, c1t и т.д.
Любой одиночный символ из Выражение c[^au1]t
последовательности, записанной соответствует фрагментам cbt,
внутри
скобок.
Допускается c2t, cXt и т.д., а выражение
использование
диапазона c[^a-zA-Z]t – фрагмент cиt, c1t,
символов
cЧt, c3t, и т.д.
7

8.

Классы символов
Метасимвол
\w
\W
Описание
Пример
любой
алфавитно-цифровой Выражение c\wt соответствует
символ, т.е. символ из множества фрагментам cat, cut, c1t, cЮt и
прописных и строчных букв и т.д., но не соответствует
десятичных цифр
фрагментам c{t, c:t и т.д.
любой не алфавитно-цифровой Выражение c\Wt соответствует
символ, т.е. символ, не входящий фрагментам c{t, c:t, c t и т.д., но
в множество прописных и не соответствует фрагментам cat,
строчных букв и десятичных cut, c1t, cЮt и т.д.
цифр
8

9.

Классы символов
Метасимвол
\s
\S
Описание
Пример
любой пробельный символ, Выражение \s\W\W\W\s
например
символ
пробела, соответствует любому слову из
табуляции (\t, \v), перевода трех букв, окруженному
строки (\n,\r), новой страницы(\f) пробельными символами
любой не пробельный символ, Выражение \s\S\S\s
т.е. символ, не входящий в соответствует любым двум
множество пробельных
непробельным символам,
окруженным пробелами
9

10.

Классы символов
Метасимвол
\d
\D
Описание
Любая десятичная цифра
Пример
Выражение c\dt соответствует
фрагментам c1t, c2t, …, c9t
Любой символ, не являющийся Выражение c\Dt не соответствует
десятичной цифрой
фрагментам c1t, c2t, …, c9t
10

11.

Синтаксис регулярных выражений
Это только небольшая часть элементов. Более подробное описание
синтаксиса регулярных выражений можно найти обучающем сайте
Microsoft в статье
11

12.

Уточняющие метасимволы
Метасимвол
Описание
^
Фрагмент совпадающий с регулярным выражением, следует
искать только в начале строки (например, выражение @"^пр\w*"
соответствует слову "привет" в строке "привет мир")
$
Фрагмент совпадающий с регулярным выражением, следует
искать только в конце строки (например, выражение @"\w*ир$"
соответствует слову "мир" в строке "привет мир", так как часть
"ир" находится в самом конце)
12

13.

Уточняющие метасимволы
Метасимвол
\A
\Z
\b
\B
Описание
Фрагмент совпадающий с регулярным выражением, следует
искать только в начале многострочной строки
Фрагмент совпадающий с регулярным выражением, следует
искать только в конце многострочной строки
Фрагмент совпадающий с регулярным выражением, начинается
или заканчивается на границе слова (т.е. между символами
соответствующими метасимволам \w и \W)
Фрагмент совпадающий с регулярным выражением, не должен
встречаться на границе слова
13

14.

Метасимволы – повторители
Ca*t
Ca+t
Ca?t
ca{3}t
ca{3,}t
ca{2,4}t
Повторители – это
метасимволы, которые
располагаются непосредственно
после обычного символа или
класса символов и задают
количество его повторений в
выражении.
14

15.

Наиболее часто употребляемые
повторители
Метасимвол
Описание
Пример
*
предыдущий символ повторяется Выражение ca*t соответствует
0 и более раз
фрагментам ct, cat, caat, caaaaat
и т.д.
+
предыдущий символ повторяется Выражение ca+t соответствует
1 и более раз
фрагментам ct, cat, caat, caaaaat
и т.д.
?
предыдущий символ повторяется Выражение ca?t соответствует
0 или 1 раз
фрагментам ct и cat
15

16.

Наиболее часто употребляемые
повторители
Метасимвол
Описание
Пример
{n}
ровно
n
повторений Выражение ca{3}t соответствует
предыдущего символа
фрагментy caaat, а выражение
cat(2) – фрагменту catcat1
{n?}
по крайней мере n повторений Выражение ca{3,}t соответствует
предыдущего символа
фрагментам caaat, caaaat,
caaaaaaaaaaaat и т.д.
{m,n}
от
n до m повторений Выражение ca{2,4}t соответствует
предыдущего символа
фрагментам caat, caaat, caaat
1 Круглые скобки служат для группировки символов
16

17.

Класс Regex

18.

Класс Regex
• Классы библиотеки .NET для работы с регулярными
выражениями объединены в пространство имен
System.Text.RegularExpressions.
• Класс Regex представляет собой регулярное выражение.
Он является неизменяемым, т.е. после создания
экземпляра его корректировка не допускается.
18

19.

Класс Regex
Для описания регулярного выражения в классе определено
несколько перегруженных конструкторов:
• Regex() - создает пустое выражение.
• Regex(string) - создает заданное выражение.
• Regix(String, RegexOptions) - создает заданное выражение и
задает параметры для его обработки с помощью элементов
перечисления RegexOptions (например, различать или не
различать прописные или строчные буквы).
19

20.

Например, у нас есть некоторый текст и нам надо найти в нем все
словоформы какого-нибудь слова. С классом Regex это сделать
очень просто:
Вывод результата
на консоль
20

21.

• Находим в искомой строке все словоформы слова "туп".
• В конструктор объекта Regex передается регулярное
выражение для поиска.
Regex regex = new Regex(@"туп(\w*)");
• Выражение туп(\w*) обозначает, найти все слова,
которые имеют корень "туп" и после которого может
стоять различное количество символов.
• Выражение \w означает алфавитно-цифровой символ, а
звездочка
после
выражения
указывает
на
неопределенное их количество - их может быть один,
два, три или вообще не быть.
21

22.

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

23.

MatchCollection matches = regex.Matches(s);
if (matches.Count > 0)
{
foreach (Match match in matches)
Console.WriteLine(match.Value);
}
else
{
Console.WriteLine("Совпадений не найдено");
}
• Метод Matches класса Regex принимает строку, к которой надо
применить регулярные выражения, и возвращает коллекцию
найденных совпадений.
• Каждый элемент такой коллекции представляет объект Match.
Его свойство Value возвращает найденное совпадение.
23

24.

Параметр
RegexOptions

25.

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

26.

Перечисления RegexOptions
Некоторые из значений, принимаемых данным
перечислением RegexOptions :
• Compiled: при установке этого значения регулярное
выражение
компилируется
в
сборку,
что
обеспечивает более быстрое выполнение
• CultureInvariant: при установке этого значения будут
игнорироваться региональные различия
26

27.

Перечисления RegexOptions
Некоторые из значений, принимаемых данным
перечислением RegexOptions :
• IgnoreCase: при установке этого значения будет
игнорироваться регистр
• IgnorePatternWhitespace: удаляет из строки
пробелы и разрешает комментарии, начинающиеся
со знака #
27

28.

Перечисления RegexOptions
Некоторые из значений, принимаемых данным
перечислением RegexOptions :
• Multiline: указывает, что текст надо рассматривать в
многострочном режиме. При таком режиме символы "^"
и "$" совпадают, соответственно, с началом и концом
любой строки, а не с началом и концом всего текста
• RightToLeft: приписывает читать строку справа налево
• Singleline: при данном режиме символ "." соответствует
любому символу, в том числе последовательности "\n",
которая осуществляет переход на следующую строку
28

29.

Примеры применения значений
перечисления RegexOptions
• При необходимости можно установить несколько параметров:
29

30.

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

31.

Примеры использования элементы
синтаксиса регулярных выражений
Первый пример с скороговоркой "Бык тупогуб, тупогубенький
бычок, у быка губа бела была тупа" и найдем в ней все слова, где
встречается корень "губ":
Выражение \w* соответствует любой последовательности
алфавитно-цифровых символов любой длины, то данное
выражение найдет все слова, содержащие корень "губ".
31

32.

Примеры использования элементы
синтаксиса регулярных выражений
Второй простенький пример - нахождение телефонного номера в
формате 111-111-1111:
Если мы точно знаем, сколько определенных символов
должно быть, то мы можем явным образом указать их
количество в фигурных скобках: \d{3} - то есть в данном
случае три цифры.
32

33.

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

34.

Примеры использования элементы
синтаксиса регулярных выражений
Можно задать диапазон для алфавитных символов:
Regex regex = new Regex("[a-v]{5}");
-данное выражение будет соответствовать любому сочетанию пяти
символов, в котором все символы находятся в диапазоне от a до v.
Можно указать отдельные значения:
Regex regex = new Regex(@"[2]*-[0-9]{3}-\d{4}");.
- данное выражение будет соответствовать, например, такому
номеру телефона "222-222-2222" (так как первые числа двойки)
34

35.

Примеры использования элементы
синтаксиса регулярных выражений
С помощью использования конструкции выбора из нескольких
символов можно задать альтернативные варианты выбора
перечислив их через вертикальную черту | , например:
Первые три цифры могут содержать только двойки или тройки.
Такой шаблон будет соответствовать, например, строкам
"222-222-2222" и "323-435-2318".
А вот строка "235-435-2318" уже не подпадает под шаблон, так как
одной из трех первых цифр является цифра 5.
35

36.

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

37.

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

38.

Примеры использования элементы
синтаксиса регулярных выражений
Например, для поиска в тексте имени файла cat.doc следует
использовать регулярное выражение cat\.doc.
Символ «точка» экранируется обратной косой чертой для этого,
чтобы он воспринимался не как метасимвол «любой символ» (в
том числе и точка!), а непосредственно.
38

39.

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

40.

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

41.

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

42.

Проверка на соответствие строки формату
Переменная pattern задает регулярное выражение для проверки
адреса электронной почты. Данное выражение предлагает нам
Microsoft на страницах msdn.
Далее в цикле мы проходим по массиву строк и определяем, какие
строки соответствуют этому шаблону, то есть представляют
валидный адрес электронной почты.
Для проверки соответствия строки шаблону используется метод
IsMatch:
Regex.IsMatch(data[i], pattern, RegexOptions.IgnoreCase).
Последний параметр указывает, что регистр можно игнорировать.
И если строка соответствует шаблону, то метод возвращает true.
42

43.

Замена
фрагментов текста
Метод Replace

44.

Замена фрагментов текста. Метод Replace
Класс Regex имеет метод Replace, который позволяет заменить
строку, соответствующую регулярному выражению, другой
строкой:
Данная версия метода Replace
принимает два параметра:
строку с текстом, где надо
выполнить замену, и сама
строка замены.
Так как в качестве шаблона выбрано выражение "\s+
(то есть наличие одного и более пробелов), метод Replace
проходит по всему тексту и заменяет несколько подряд идущих
пробелов ординарными.
44

45.

Другой пример - на вход подается номер телефона в произвольном
формате, и мы хотим оставить в нем только цифры:
В данном случае шаблон "\D" представляет любой символ, который
не является цифрой.
Любой такой символ заменяется на пустую строку "", то есть в итоге
из строки "+1(876)-234-12-98" мы получим строку "18762341298". 45

46.

Разделение
заданной строки
на фрагменты
Метод Split

47.

Разделение заданной строки на фрагменты.
Метод Split
Класс Regex имеет метод Split, который позволяет разбить заданную
строку на фрагменты в соответствии с разделителями, заданными с
помощью регулярного выражения, и возвращает эти фрагменты в
массиве строк:
В следующем примере шаблон
регулярного выражения [a-z] + и
метод Regex.Split() используются
для разделения строки на
символы без учета их регистра.
47
English     Русский Rules