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

regex
Регулярные выражения это способ обработки текстовой информации и язык для построения масок. Маска это набор символов и специальных обозначений, представляющих некоторый шаблон, который используется для выделения подстрок для дальнейшей работы с ними (замена, выделение, проверка условий).
Регулярные выражения поддерживаются многими популярными языками: C#, javascript, pyton, php и другие.

Примечание: правила построения масок одинаковы почти во всех случаях.

Как использовать регулярные выражения на C#?

Для работы с регулярными выражениями необходимо выполнить три шага:

  • Создать маску
  • Создать экземпляр класса Regex
  • Обработать текст с помощью Regex
...
   string pattern=@"\sHello{3}";  //mask for catching "hello" with three O in the end and one space in left side
...

Примечание: паттерн или маска это правило обработки текста. Вы можете протестировать свою маску на онлайн тестере.

...
   Regex reg = new Regex(pattern);  //регулярное выражение
   
   string text="Hi, John. Hellooo, Mary. Hello, Gary.";  // текстовая информация

   MatchCollection matches = reg.Matches(text);  //получение коллекции совпадений. В нашем случае будет одно совпадение " Hellooo"
...

Возможно обратиться к совпадению (Match) в коллекции по индексу. В классе Match есть свойства:

  • Value — строка, выделенная маской
  • Index — позиция первого символа захваченной строки в тексте
  • Length — количество символов в захваченной строке
...
   string firstmatch=matches[0].Value; //firstmatch равно " Hellooo"
...

Как игнорировать letter case в регулярных выражениях?

...
   Regex regex = new Regex(pattern, RegexOptions.IgnoreCase); //игнорирует letter case

   Regex regex2 = new Regex(pattern, RegexOptions.IgnoreCase | RegexOptions.RightToLeft); //игнорирует letter case и обрабатывает текст справа налево
...

Note: Возможно устанавливать много RegexOptions (RegexOptions.IgnoreCase | RegexOptions.RightToLeft | RegexOptions.Compiled).

Как произвести замену с помощью Regex?

...
   //заменяет "Helooo" на "Howdy"
   string newtext = Regex.Replace(text, pattern, "Howdy");
...

Как создать список выделенных строк с Regex?

...
   MatchCollection matches = reg.Matches(text);  //коллекция совпадений из текста

   List resultlist = matches.Select(m => m.Value).ToList();  //используя Linq

   string[] resultarray= new string[matches.Count];  //не используя Linq

   for(int i=0;i<matches.Count;i++)
   {
      resultarray[i] = matches[i].Value;
   }

...

Как установить время выполнения Regex?

...
   Regex regEx = new Regex(pattern, RegexOptions.None, TimeSpan.FromSeconds(10));  //останавливает обработку после 10 секунд
...

Как ускорить работу регулярного выражения?

Когда приходится обрабатывать большие текстовые файлы, работа регулярных выражений сильно замедляется. Установив RegexOptions.Compiled можно ускорить работу выполнения, но в этом случае увеличится время на компиляцию проекта.

...
   Regex regEx = new Regex(pattern, RegexOptions.Compiled);  //компилируется дольше, но работает быстрее
...

Маска для нахождения электронной почты в тексте

Данная маска поможет обнаружить обычную почту (email@email.com), сложную (с точками и дефисами) (my-email@email.com) и защищенную от спама (email[at]email.com, email@email dot com):

...
   string emailpattern = @"([a-zA-Z0-9_\-\.]+)(@|(\s*\[\s*at\s*\]\s*)|(\s*" + "\"" + @"\s*(at)\s*" + "\"" + @"\s*))([a-zA-Z0-9_\-\.]+)((\.)|(\s+dot\s+)|(\s*\[\s*dot\s*\]\s*)|(\s*" + "\"" + @"\s*(dot)\s*" + "\"" + @"\s*))([a-zA-Z]{2,5})";
...

Маска для нахождения ссылок на веб-странице

...
   string tagPat = @"?<\s*a[^>]*>(.*?)?<\s*/\s*a\s*>";  //маска для тегов А

   string hrefPat = "href *= *(\"(?<url>.+?)\")";  //маска с группой url для атрибутов href
...

Работа с группами в регулярном выражении

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

... 
   string hrefPat = "href *= *(\"(?<url>.+?)\")"; //маска с группой url для атрибутов href
   
   string text = "<a href=\"http://somedomain\"> Domain </a>";

   Regex regex = new Regex(hrefPat, RegexOptions.IgnoreCase);

   string result=regex.Match(text).Groups["url"].Value;  //result будет равен http://somedomain
...
Поделиться этой записью

Оставить комментарий