Регулярные выражения
Регулярные выражения это один из способов поиска подстрок (соответствий) в строках. Используются для: проверки наличия соответствующей шаблону подстроки; поиска и выдачи пользователю соответствующих шаблону подстрок; замены соответствующих шаблону подстрок. using System.Text.RegularExpression; Regex re = new Regex("образец", "опции"); MatchCollection me = re.Matches("строка для поиска"); iCountMatchs = me.Count;
СимволИнтерпретация Категория: escape-последовательности \b \t \r \nПри использовании его в квадратных скобках соответствует символу "обратная косая черта" с кодом Категория: подмножества (классы) символов.Соответствует любому символу, за исключением символа конца строки [aeiou]Соответствует любому символу из множества, заданного в квадратных скобках [^aeiou]Отрицание. Соответствует любому символу, за исключением символов, заданных в квадратных скобках [0-9a-fA-F]Задание диапазона символов, упорядоченных по коду. Так, 0-9 задает любую цифру \p{name}Соответствует любому символу, заданному множеству с именем name, например, имя Ll задает множество букв латиницы в нижнем регистре. Поскольку все символы разбиты на подмножества, задаваемые категорией Unicode, то в качестве имени можно задавать имя категории \P{name}Отрицание. Большая буква всегда задает отрицание множества, заданного малой буквой \wМножество символов, используемых при задании идентификаторов - большие и малые символы латиницы, цифры и знак подчеркивания \sСоответствует символам белого пробела \dСоответствует любому символу из множества цифр
Категория: Операции (модификаторы) *Итерация. Задает ноль или более соответствий; например, \w* или (abc)*. Аналогично, {0,} +Положительная итерация. Задает одно или более соответствий; например, \w+ или (abc)+. Аналогично, {1,} ?Задает ноль или одно соответствие; например, \w? или (abc)?. Аналогично, {0,1} {n}Задает в точности n соответствий; например, \w{2} {n,}Задает, по меньшей мере, n соответствий; например, (abc){2,} {n,m}Задает, по меньшей мере, n, но не более m соответствий; например, (abc){2,5} Категория: Группирование (? )При обнаружении соответствия выражению, заданному в круглых скобках, создается именованная группа, которой дается имя Name. Например, (? \d{7}). При обнаружении последовательности из семи цифр будет создана группа с именем tel ()Круглые скобки разбивают регулярное выражение на группы. Для каждого подвыражения, заключенного в круглые скобки, создается группа, автоматически получающая номер. Номера следуют в обратном порядке, поэтому полному регулярному выражению соответствует группа с номером 0
* Соответствует 0 или более вхождений предшествующего выражения. Например, 'zo*' соответствует "z" и "zoo". + Соответствует 1 или более предшествующих выражений. Например, "zo+" соответствует "zo" и "zoo", но не "z". ? Соответствует 0 или 1 предшествующих выражений. Например, 'do(es)?' соответствует "do" в "do" или "does". {n} n неотрицательное целое. Соответствует точному количеству вхождений. Например, 'о{2}' не найдет "о" в "Bob", но найдет два "о" в "food". {n,} n неотрицательное целое. Соответствует вхождению, повторенному не менее n раз. Например, *о{2,}' не находит "о" в "Bob", зато находит все "о" в "foooood". {n,m} n и m неотрицательные целые числа, где n
Граница слова Для задания границ слова используются метасимволы '\b' и '\В Regex re = new Regex(«\bменя", "ms"); Вариации и группировка Символ | можно использовать для перебора нескольких вариантов. Regex re = new Regex("like (apples|pines|bananas)"); MatchCollection me = re.Matches("I like apples a lot");
Класс Regex Метод Match запускает поиск соответствия. Метод Matches позволяет разыскать все вхождения, то есть все подстроки, удовлетворяющие образцу. Метод NextMatch запускает новый поиск, начиная с того места, на котором остановился предыдущий поиск. Метод Split является обобщением метода Split класса String. Он позволяет, используя образец, разделить искомую строку на элементы. Метод Replace – позволяет делать замену найденного образца.
string FindMatch(string str, string strpat){ Regex pat = new Regex(strpat); Match match =pat.Match(str); string found = ""; if (match.Success) { found =match.Value; Console.WriteLine("Строка ={0}\tОбразец={1}\t Найдено={2}", str,strpat,found); } return(found); } public void TestSinglePat(){ //поиск по образцу первого вхождения string str, strpat, found; Console.WriteLine("Поиск по образцу"); //образец задает подстроку, начинающуюся с символа a, далее идут буквы или цифры. str ="start"; strpat found = FindMatch(str,strpat);//art str ="fab77cd efg"; found = FindMatch(str,strpat);//ab77cd //образец задает подстроку, начинающуюся с символа a, //заканчивающуюся f с возможными символами b и d в середине strpat = "a(b|d)*f"; str = "fabadddbdf"; found = FindMatch(str,strpat);//adddbdf //диапазоны и escape-символы strpat = "[X-Z]+"; str = "aXYb"; found = FindMatch(str,strpat);//XY strpat str = "aXYZb"; found = FindMatch(str,strpat);//XYZ }
Console.WriteLine("око и рококо"); strpat="око"; str = "рококо"; FindMatches(str, strpat);//Число совпадений 1 Console.WriteLine("кок и кук"); strpat="(т|к).(т|к)"; str="кок тот кук тут как кот"; FindMatches(str, strpat);// Число совпадений 6 public void TestParsing(){ string str,strpat; str = "А это пшеница, которая в темном чулане хранится, в доме, который построил Джек!"; strpat =" +|, "; //один или несколько пробелов или запятая и пробел Regex pat = new Regex(strpat); string[] words; words = pat.Split(str); int i=1; foreach(string word in words) Console.WriteLine("{0}: {1}",i++,word); }
Regex r = new string s="bacghghaaab"; s=r.Replace(s,"_$1_"); Console.WriteLine("{0}",s); Regex r = new string s="dotsitedotsitedotsiterulez"; s=r.Replace(s,"f",1); Console.WriteLine("{0}",s); Regex r = new string s="dotsitedotsitedotsiterulez"; s=r.Replace(s,"f",2,1); Console.WriteLine("{0}",s);
Классы Match и MatchCollection свойства Index, Length и Value наследованы от прародителя Capture. Они описывают найденную подстроку - индекс начала подстроки в искомой строке, длину подстроки и ее значение; свойство Groups класса Match возвращает коллекцию групп - объект GroupCollection, который позволяет работать с группами, созданными в процессе поиска соответствия; свойство Captures, наследованное от объекта Group, возвращает коллекцию CaptureCollection. public static void Main( ) { string si = "Это строка для поиска"; // найти любой пробельный символ следующий за непробельным Regex theReg = new // получить коллекцию результата поиска MatchCollection theMatches = theReg.Matches (si); // перебор всей коллекции foreach (Match theMatch in theMatches) { Console.WriteLine( "theMatch.Length: {0}", theMatch.Length); if (theMatch.Length != 0) Console.WriteLine("theMatch: {0}", theMatch.ToString( )); }} theMatch.Length: 4 theMatch: Это theMatch.Length: 7 theMatch: строка theMatch.Length: 4 theMatch: для
Классы Group и GroupCollection при обнаружении одной подстроки, удовлетворяющей условию поиска, создается не одна группа, а коллекция групп; группа с индексом 0 содержит информацию о найденном соответствии; число групп в коллекции зависит от числа круглых скобок в записи регулярного выражения. Каждая пара круглых скобок создает дополнительную группу, которая описывает ту часть подстроки, которая соответствует шаблону, заданному в круглых скобках; группы могут быть индексированы, но могут быть и именованными, поскольку в круглых скобках разрешается указывать имя группы. public void TestAttributes(){ string s1 = "tel: (831-2) "; string s2 = "Адрес: , Москва, 5-й Донской проезд, стр.10,кв.7"; string s3 = " "; string s4 = s1+ s2 + s3; string s5 = s2 + s1 + s3; string pat1 \((\d|-)*\)\s(\d|-)+)\s"; string [0-9А-Яа-я |-|,|.]+)\s"; string pat3 string compat = pat1+pat2+pat3; string tel="", addr = "", em = "";
Regex reg1 = new Regex(pat1); Match match1= reg1.Match(s4); Console.WriteLine("Value =" + match1.Value); // tel: (831-2) tel=match1.Groups["tel"].Value; Console.WriteLine(tel);// (831-2) Regex reg2 = new Regex(pat2); Match match2= reg2.Match(s5); Console.WriteLine("Value =" + match2.Value); // Адрес: , Москва, 5-й Донской проезд, стр.10,кв.7 addr= match2.Groups["addr"].Value; Console.WriteLine(addr); //117926, Москва, 5-й Донской проезд, стр.10,кв.7 Regex reg3 = new Regex(pat3); Match match3= reg3.Match(s5); Console.WriteLine("Value =" + match3.Value); // em= match3.Groups["em"].Value; Console.WriteLine(em);//
Составной шаблон: Regex comreg = new Regex(compat); Match commatch= comreg.Match(s4); tel= commatch.Groups["tel"].Value; Console.WriteLine(tel); addr= commatch.Groups["addr"].Value; Console.WriteLine(addr); em= commatch.Groups["em"].Value; Console.WriteLine(em); }