Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






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




Стандартные классы String и StringBuilder предназначены для работы со строками и позволяют выполнять над ними различные операции, такие как поиск, замена, вставка и удаление подстрок. Однако существуют задачи по обработке символьной информации, для которых стандартных возможностей классов String и StringBuilder не достаточно. Для упрощения решения подобных задач в пространстве имен System.Text.RegularExpressions определены классы для работы со строками, основанные на регулярных выражениях, Regex, Match и MatchCollection. Регулярное выражение – это шаблон, согласно которому выполняется поиск соответствующего фрагмента текста. Использование регулярных выражений обеспечивает: проверку строки на соответствие шаблону, поиск в тексте по заданному шаблону, а также разбиение текста на фрагменты.

Язык описания регулярных выражений состоит из символов двух видов: обычных символов и метасимволов. Обычный символ представляет в выражении сам себя, а метасимвол – некоторая совокупность символов. Наиболее употребительные метасимволы с описанием и примером использования представлены в следующей таблице.

Набор символов Описание Пример
. Любой символ, кроме \n. Выражение c.t соответствует фрагментам: cat, cut, c#t, c{t и т.д.
[ ] Любой одиночный символ из последовательности, записанной внутри скобок. Допускается использование диапазонов символов,для задания которого используется символ «-». Выражение c[aui]t соответствует фрагментам: cat, cut, cit. Выражение c[a-c]t соответствует фрагментам: cat, cbt, cct.
[^] Любой одиночный символ, не входящий в последовательность, записанную внутри скобок. Допускается использование диапазонов символов. Выражение c[^aui]t соответствует фрагментам: cbt, cct, c2t и т.д. Выражение c[^a-c]t соответствует фрагментам: cdt, cet, c%t и т.д.
\w Любой алфавитно-цифровой символ, а также символ подчеркивания. Выражение c\wt соответствует фрагментам: cbt, cct, c2t, c_t и т. д., но не соответствует фрагментам c%t, c{t и т. д.
\W Любой символ не удовлетворяющий \w. Выражение c\Wt соответствует фрагментам: c%t, c{t, c.t и т.д., но не соответствует фрагментам cbt, cct, c2t и т.д.
\s Любой пробельный символ (пробел, табуляция и переход на новую строку). Выражение \s\w\w\w\s соответствует любому слову из трех букв, окруженному пробельными символами. Следует отметить, что слова стоящие на границе текста не удовлетворяют данному регулярному выражению, т.к. начало/конец строки не являются пробельными символами.
\S Любой не пробельный символ. Выражение \s\S\S\S\s соответствует любым трем непробельным символам, окруженным пробельными.
\b Любой символ, кроме удовлетворяющих \b. Выражение \B\d\d\d\B соответствует любым трем цифрам, входящим в состав слова так, что ни справа ни слева от них нет конца слова.
\d Любая десятичная цифра. Выражение c\dt соответствует фрагментам: c1t, c2t, c3t и т.д.
\D Любой символ, не являющийся десятичной цифрой. Выражение c\Dt не соответствует фрагментам: c1t, c2t, c3t и т.д.
| Задает альтернативу, другими словами, символ | соответствует операции или. Выражение c[a-c]|[0-2] соответствует фрагментам: ca, cb, cc, c0, c1, c2.
^ Если стоит в начале выражения, то фрагмент, совпадающий с регулярным выражением, следует искать только в начале текста. Иначе трактуется просто как символ. Выражение ^cat определяет последовательность символов cat, расположенную в начале строки.
$ Если стоит в конце выражения, то фрагмент, совпадающий с регулярным выражением, следует искать только в конце текста. Иначе трактуется просто как символ. Выражение cat$ определяет последовательность символов cat, расположенную в конце строки.
Аналог ^ для многострочной строки.  
\Z Аналог $ для многострочной строки.  

Если нужно найти какой-то символ, который является метасимволом, например, точку, можно это сделать сопроводив ее обратным слэшем. Т.е., просто точка означает любой одиночный символ, а «\.» означает символ точку. Например, выражение «\d\.\d» соответствует фрагментам: 2.6, 4.0, 9.1 и т.д., а выражение «С:\\Land» соответствует фрагменту: С:\Land. В регулярных выражениях часто используются повторители – метасимволы, которые располагаются непосредственно после обычного символа или группы символов и задают количество его повторений в выражении.

Повторители Описание Пример
* Ноль, или более повторений предыдущего элемента. Выражение ca*t соответствует фрагментам: ct, cat, caat, caaat и т.д.
+ Одно, или более повторений предыдущего элемента. Выражение ca+t соответствует фрагментам: cat, caat, caaat и т.д.
? Не более одного повторения предыдущего элемента. Выражение ca?t соответствует фрагментам: ct, cat.
{n} Ровно n повторений предыдущего элемента. Выражение ca{3}t соответствует фрагменту: cаааt. Выражение (cat){2} соответствует фрагменту: cаtcat.
{n,} По крайней мере n повторений предыдущего элемента. Выражение ca{3,}t соответствует фрагментам: cаааt, caaaat, caaaaaaat и т.д. Выражение (cat){2,} соответствует фрагментам: cаtcat, catcatcat и т.д.
{n, m} От n до m повторений предыдущего элемента. Выражение ca{2,4}t соответствует фрагментам: cааt, caaat, caaaat.

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

1. Слово rus – @"rus"

2. Номер телефона в формате xxx-xx-xx – @"\d\d\d-\d\d-\d\d" или @"\d{3}(-\d\d){2}"

3. Целое число со знаком, или без знака – @"[+-]?\d+"

4. Номер автомобиля – @"[A-Z]\d{3}[A-Z]{2}\d{2,3}RUS"

5. Время в формате чч.мм, или чч:мм – @"([01]\d)|(2[0-4])[\.:][0-5]\d"

Важнейшим классом, поддерживающим работу с регулярными выражениями, является класс Regex. Для описания регулярного выражения в классе определено несколько перегруженных конструкторов:

1. Regex(String) – создает регулярное выражение на основе строкового литерала;

2. Regex(String, RegexOptions) – создает регулярное выражение на основе строкового литерала и задает параметры для его обработки с помощью элементов перечисления RegexOptions (например, различать, или нет прописные и строчные буквы).

В классе Regex реализованы методы IsMach, Mach, Matches, Replace, Split. Следующий пример демонстрирует использование метода IsMach, который возвращает true, если в заданной строке найден фрагмент, соответствующий регулярному выражению; в противном случае метод возвращает false.

Regex r = new Regex("собака", RegexOptions.IgnoreCase);

string text1 = "Кот в доме, собака в конуре.";

string text2 = "Котик в доме, собачка в конуре.";

Console.WriteLine(r.IsMatch(text1)); //True

Console.WriteLine(r.IsMatch(text2)); //False

В следующем примере с помощью метода IsMach определяется, есть ли в заданных строках номера телефона в формате xx-xx-xx или xxx-xx-xx.

Regex r = new Regex(@"\d{2,3}(-\d\d){2}");

string text1 = "tel:123-45-67";

string text2 = "tel:no";

string text3 = "tel:12-34-56";

Console.WriteLine(r.IsMatch(text1));//True

Console.WriteLine(r.IsMatch(text2));//False

Console.WriteLine(r.IsMatch(text3));//True

Метод Match класса Regex возвращает объект класса Match, который ссылается на первый найденный фрагмент текста, соответствующий заданному шаблону. Все фрагменты текста, соответствующие заданному шаблону, в прямом порядке следования образуют «список» доступный только для чтения. Для работы с ним в классе Match реализовано несколько свойств и методов, некоторые из которых приведены в следующей таблице.

Член класса Описание
Success (свойство) Возвращает true, если список содержит ссылку на найденный фрагмент текста; в противном случае возвращает false.
Length (свойство) Возвращает длину найденного фрагмента текста.
Index (свойство) Возвращает индекс найденного фрагмента текста в исходной строке.
NextMatch (метод) Переходит к следующему фрагменту текста в «списке».

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

Regex r = new Regex (@"[-+]?\d+");

string text = @"5*10=50 -80/40=-2";

Match teg = r.Match(text);

int sum = 0;

while (teg.Success)

{

Console.Write("{0} ", teg.Value);

sum += int.Parse(teg.ToString());

teg = teg.NextMatch();

}

Console.WriteLine("\nsum={0}", sum);

Метод Matches класса Regex возвращает объект класса MatchCollection – коллекцию только для чтения всех фрагментов заданной строки, совпавших с шаблоном.

string text = @"5*10=50-80/40=-2";

Regex theReg = new Regex(@"[-+]?\d+");

MatchCollection didgits = theReg.Matches(text);

Console.WriteLine("Количество чисел в тексте {0}",didgits.Count);

foreach (Match item in didgits)

{

Console.Write("{0} ", item);

}

Console.WriteLine();

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

string text = @"Контактные телефоны tel: 123-45-67, 123-34-56; fax:123-56-45.";

Console.WriteLine("Старые данные\n" + text);

string newText = Regex.Replace(text, @"\d{2,3}(-\d\d){2}", "");

Console.WriteLine("Новые данные\n" + newText);

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

string text = @"Контакты телефоны: 123-45-67, 123-34-56.";

string[] newText = Regex.Split(text, "[,.:;]+");

При выполнении операций с использованием регулярных выражений важно помнить о том, что регулярные выражения – это крайне мощное, но и крайне медленное средство. Например, метод Replace класса Regex работает примерно в 10 раз медленнее аналогичного метода класса string. А, следовательно, не следует использовать регулярные выражения там, где можно обойтись работой со строками.

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

http://msdn.microsoft.com/ru-ru/library/c75he57e.aspx

http://www.ultrapico.com/ExpressoDownload.htm


[1] В.NET Framework 4 появилась возможность динамической типизации в С# с использованием нового ключевого слова dynamic.

[2] В соответствии с терминологией, принятой при переводе англоязычной литературы по программированиию, термин operator в данном курсе переводится как «операция», а statement – как «оператор».






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных