OTUS. Онлайн-образование corporate blog
Programming
C#
3 October

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

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




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

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

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


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

Класс Regex


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

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

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

// Создаем шаблон для слова, которое начинается с буквы "M"  
string pattern = @"\b[M]\w+";  
// Создаем экземпляр Regex   
Regex rg = new Regex(pattern); 


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

// Длинная строка  
string authors = "Mahesh Chand, Raj Kumar, Mike Gold, Allen O'Neill, Marshal Troll";  


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

// Получаем все совпадения  
MatchCollection matchedAuthors = rg.Matches(authors);  


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

// Выводим всех подходящих авторов  
for (int count = 0; count < matchedAuthors.Count; count++)  
Console.WriteLine(matchedAuthors[count].Value);  


Вот полный код:

// Создаем шаблон для слова, которое начинается с буквы "M"  
string pattern = @"\b[M]\w+";  
// Создаем экземпляр Regex  
Regex rg = new Regex(pattern);  
  
// Длинная строка  
string authors = "Mahesh Chand, Raj Kumar, Mike Gold, Allen O'Neill, Marshal Troll";  
// Получаем все совпадения  
MatchCollection matchedAuthors = rg.Matches(authors);  
/// Выводим всех подходящих авторов  
for (int count = 0; count < matchedAuthors.Count; count++)  
Console.WriteLine(matchedAuthors[count].Value);  


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

// Создаем шаблон для слова, которое начинается с буквы "M"  
string pattern = @"\b[m]\w+";  
// Создаем экземпляр Regex  
Regex rg = new Regex(pattern, RegexOptions.IgnoreCase);


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


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

// Длинная строка с множественными пробелами  
string badString = "Here is a strig with ton of white space." ;  
string CleanedString = Regex.Replace(badString, "\\s+", " ");  
Console.WriteLine($"Cleaned String: {CleanedString}");  


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

string CleanedString = Regex.Replace(badString, "\\s+", "-");


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


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

// Разбиваем строку по символам  
string azpattern = "[a-z]+";  
string str = "Asd2323b0900c1234Def5678Ghi9012Jklm";  
string[] result = Regex.Split(str, azpattern,  
RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(500));  
for (int i = 0; i < result.Length; i++)  
{  
    Console.Write("'{0}'", result[i]);  
    if (i < result.Length - 1)  
        Console.Write(", ");  
}  


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


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

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

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Text.RegularExpressions;  
  
namespace RegularExpression1  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            Regex r = new Regex(@"^\+?\d{0,2}\-?\d{4,5}\-?\d{5,6}");  
            // класс Regex представляет неизменное регулярное выражение.  
  
            string[] str = { "+91-9678967101", "9678967101", "+91-9678-967101", "+91-96789-67101", "+919678967101" };  
            // Входные строки для сопоставления с действительным номером мобильного телефона.  
            foreach (string s in str)  
            {  
                Console.WriteLine("{0} {1} a valid mobile number.", s,  
                r.IsMatch(s) ? "is" : "is not");  
                // Метод IsMatch используется для валидации строки, или чтобы гарантировать, что строка соответствует определенному шаблону.  
            }  
        }  
    }  
}  


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

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


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

^((\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)\s*[;]{0,1}\s*)+$

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

^((\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)\s*[,]{0,1}\s*)+$

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

^((\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*)\s*[;,.]{0,1}\s*)+$

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

Узнайте больше можно здесь: Regex для проверки нескольких адресов электронной почты.

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


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

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

if (!Regex.Match(firstNameTextBox.Text, "^[A-Z][a-zA-Z]*$").Success) {}  
    if (!Regex.Match(addressTextBox.Text, @"^[0-9]+\s+([a-zA-Z]+|[a-zA-Z]+\s[a-zA-Z]+)$").Success)  
  
if (!Regex.Match(cityTextBox.Text, @"^([a-zA-Z]+|[a-zA-Z]+\s[a-zA-Z]+)$").Success)  
     if (!Regex.Match(stateTextBox.Text, @"^([a-zA-Z]+|[a-zA-Z]+\s[a-zA-Z]+)$").Success)
  
if (!Regex.Match(zipCodeTextBox.Text, @"^\d{5}$").Success)  
{  
    if (!Regex.Match(phoneTextBox.Text, @"^[1-9]\d{2}-[1-9]\d{2}-\d{4}$").Success)  


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


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


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

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

using System;  
using System.Text.RegularExpressions;  
using System.Collections.Generic;  


Пример 1:

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

string Text = "1 One, 2 Two, 3 Three is good.";  
  
string[] digits = Regex.Split(Text, @"\D+");  
  
foreach (string value in digits)  
{  
    int number;  
    if (int.TryParse(value, out number))  
    {  
        Console.WriteLine(value);  
    }  
}  


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

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

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

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


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

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

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

Regex.Replace(your String, @"[^0-9a-zA-Z]+", "")  


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

Regex.Replace(Your String, @"[^0-9a-zA-Z:,]+", "")


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

Примечание:

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


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



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

Вот еще одна статья: "Использование регулярных выражений в C#"

+7
6.1k 68
Comments 10
Top of the day