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

Как и сам System. String, большинство объектов, созданных из классов регулярных выражений, являются неизменяемыми. Главной “рабочей лошадкой” всей системы регулярных выражений является класс Regex, находящийся в пространстве имен System.Text.RegularExpressions.

Одним из наиболее распространенных способов его применения является создание экземпляра Regex для представления регулярного выражения посредством передачи его конструктору строки шаблона поиска. Затем этот экземпляр применяется к строке для поиска возможных совпадений.

Можно также определить, где именно в строке находятся последовательные вхождения искомого шаблона. Давайте сначала рассмотрим пример того, как выглядит базовый поиск с Regex, а потом обратимся к более полезным способам применения Regex.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System;
using System.Text.RegularExpressions;
public class EntryPoint
{
static void Main ( string[] args )  {
if( args.Length < 1 )  {
Console.WriteLine ( "Вы должны предоставить строку." );
return;
}
// Создать регулярное выражение для поиска шаблона IP-адреса
string pattern = @"\d\d?\d?\.\d\d?\d?.\d\d?\d?.\d\d?\d?";
Regex regex = new Regex ( pattern ) ;
Match match = regex.Match ( args[0] );
while ( match.Success )  {
Console.WriteLine ( "IP-адрес найден в позиции {0} со " + "значением {1}", match.Index, match.Value ) ;
match = match.NextMatch();
}

Код в этом примере производит поиск IP-адреса в строке, переданной в виде параметра командной строки. Поиск довольно топорный, но дальше он будет усовершенствован.

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

В данном примере \d означает десятичную цифру. Символы, снабженные суффиксом — знаком вопроса (?), означают одно или более вхождений предыдущего шаблонного символа регулярного выражения. Обратите внимание на защищенные слэшем точки. Дело в том, что точка сама по себе в регулярном выражении имеет определенный смысл. Незащищенная точка соответствует любому одиночному символу в позиции, где она находится.

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

“Вот такой IP-адрес:123.123.1.123″
то вывод будет выглядеть следующим образом:

IP-адрес найден в позиции 19 со значением 123.123.1.123

В предыдущем примере создается новый экземпляр Regex по имени regex и затем с помощью метода Match применяется шаблон к заданной строке. Результат соответствия сохраняется в переменной match. Эта переменная содержит первое вхождение шаблона в строку. Для определения, найдено ли соответствие регулярному выражению в строке, используется свойство Match. Success.

Далее следует код, получающий дополнительную информацию о найденном вхождении с помощью свойств Index и Value. И, наконец, вызовом метода Match.NextMatch осуществляется переход к следующему соответствию в строке, и так до тех пор, пока не будут перебраны все вхождения шаблона в строке.

В качестве альтернативы вместо вызова Match.NextMatch в цикле можно вызвать метод Regex .Matches для получения коллекции MatchCollection, которая даст все вхождения сразу, поэтому перебирать их по одному не понадобится. Во всех примерах применения Regex в настоящей главе вызываются методы экземпляра Regex.

У многих из таких методов, например, Match и Replace, также имеются статические версии, для которых предварительное создание экземпляра Regex не требуется, а нужно просто передать шаблон регулярного выражения при вызове метода.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100