C# Regex Tutorial: Какво е C# Regular Expression

Този урок по Regex на C# обяснява какво е регулярен израз в C#, какъв е неговият синтаксис, какви са методите на класа Regex и как да ги използваме с помощта на примери:

Регулярните изрази в C# се използват за съпоставяне на определен шаблон от символи. Регулярните изрази се използват винаги, когато потребителят трябва да намери някакъв повтарящ се шаблон или да направи проверка на данните, или дори за проверка на форматирането на данните.

RegEx се използва, за да се установи дали даден низ съдържа или съвпада с даден шаблон от символи. Regex е предимно последователност от символи, която обозначава шаблон.

Шаблонът може да бъде всякакъв - от числа, символ или комбинация от всички. Regex се използва широко за валидиране. Разбор или съвпадение на низове, например, намиране на съответствие на даден низ с формат на валута, телефонен номер или дата.

Клас Regex в C#

Класът Regex се използва в езика C# за извършване на regex операции. Той съдържа няколко различни метода, които могат да се използват за извършване на различни операции, свързани с regex.

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

Класът regex се намира в пространството от имена; System.Text.RegularExpression. Класът приема низ под формата на последователност от символи като параметър.

C# Regex методи

IsMatch

Най-простият и полезен метод в класа Regex е методът IsMatch. Този метод има различни претоварвания за извършване на съвпадение на символи въз основа на различни параметри.

Най-простият е

Замяна(String text, String replacementText)

Методът replace приема два параметъра и връща стойност на низ. Първият параметър е последователността от символи или regex, която искате да използвате за съвпадение, а вторият е замяната на regex.

Методът работи, като намира съвпадение на дадения текст и след това го заменя с текста за замяна, предоставен от потребителя. Подписът на метода е публичен низ Replace(низ текст, низ replacementText)

Публична функция string[] Split(string text)

Методът split от класа regex приема като параметър входящ низ и връща масив, съдържащ поднизове. Параметърът, който се подава на метода, е низът, който трябва да бъде разделен.

Методът открива съвпадащите входни шаблони в низа и след като идентифицира някой съвпадащ шаблон, разделя низа на това място на по-малки поднизове, като всеки съвпадащ шаблон е точка на прекъсване. След това методът връща масив, съдържащ всички поднизове.

Използване на методите Regex C#

Нека разгледаме използването на тези методи, като напишем проста програма.

 public static void Main(string[] args) { string patternText = "Hello"; Regex reg = new Regex(patternText); //IsMatch(string input) Console.WriteLine(reg.IsMatch("Hello World")); //IsMatch(string input, int index) Console.WriteLine(reg.IsMatch("Hello", 0)); //IsMatch(string input, string pattern) Console.WriteLine(Regex.IsMatch("Hello World", patternText)); //Replace(string input, stringreplacement) Console.WriteLine(reg.Replace("Hello World", "Replace")); //Split(string input, string pattern) string[] arr = Regex.Split("Hello_World_Today", "_"); foreach(string subStr in arr) { Console.WriteLine("{0}", subStr); } } 

Изходът на горната програма

Истински

Истински

Истински

Замяна на света

Здравейте

World

Днес

Обяснението на горния код:

В началото на програмата създадохме обект и за шаблона, който ще използваме за съвпадение на кода в последващия низ за въвеждане, използвахме форматиране на текст, за да запазим нещата прости в началото, но ако се чувствате комфортно, можете да започнете да използвате шаблони за регулярни изрази. (Ще обсъдим шаблона за регулярни изрази подробно, докато напредваме в този урок)

След това ще използваме низ за съвпадение, за да въведем фактора, който сме декларирали като посочения обект, с входния низ и ако той съвпада, ще се върне, за да върне false.

Следващият метод, който използвахме, е IsMethod(string input, int index). Този метод приема два параметъра и тук предоставяме входния низ и индекса, от който трябва да започне съвпадението. Например, тук искаме да започнем съпоставянето от началото на входния низ.

След това демонстрирахме използването на IsMatch(string input, string pattern). Тук предоставихме входния низ, след което искахме да разберем дали текстът на шаблона присъства във входа или не. Ако присъства, тогава ще се върне true (както в нашия случай), в противен случай ще се върне false.

Друг метод, който разгледахме, е заместването. Този метод е доста полезен в програми, в които искате да направите промени във входните данни или да промените формата на съществуващите данни.

Тук предоставяме два параметъра, първият е входният низ, а вторият е низът, който може да се използва за замяна на предишния низ. Този метод също така използва шаблона, определен в обекта regex, който дефинирахме по-рано.

Друг важен метод, който използвахме, е split. Този метод се използва за разделяне на дадения низ въз основа на някои повтарящи се модели. Тук сме предоставили низ "Hello_World_Today".

Да кажем, че искаме да премахнем подчертаването от дадения низ и да получим поднизчетата. За целта задаваме входния параметър и след това даваме шаблона, който трябва да използваме като точка на разделяне. Методът връща масив и можем да използваме прост цикъл като foreach, за да извлечем всички низове.

Синтаксис на редовните изрази

Съществуват няколко различни синтаксиса, като например специални символи, квантификатори, класове символи и т.н., които могат да се използват за намиране на определен шаблон от даден вход.

В тази част на урока ще се потопим в синтаксиса, предлаган от regex, и ще се опитаме да решим някои реални сценарии, използвайки ги. Преди да продължим, уверете се, че сте придобили основната представа за regex и различните методи, налични в класа regex.

Специални символи

Специалните знаци в регекса се използват за присвояване на няколко различни значения на даден шаблон. Сега ще разгледаме някои от широко използваните специални знаци и тяхното значение в регекса.3

Специални символи Значение
^ Това е един от най-широко използваните синтаксиси. Той обозначава началото, думата или шаблонът след него започва да съвпада от началото на входния текст.
$ Този знак се използва за съвпадение на думи от края на низа. Думите/шаблоните, обозначени преди този знак, ще съвпадат с думите, които се намират в края на низа.
. (точка) Точката се използва за съпоставяне на единичен символ в дадения низ, който се появява веднъж.
\n Използва се за нов ред.
\d и \D Малките букви "d" се използват за съвпадение на цифров символ, а големите букви "D" се използват за съвпадение на нецифрови символи.
\s и \S Малките букви "s" се използват за съвпадение на бели пространства, а големите букви "S" се използват за съвпадение на небели пространства.
\w и \W Малките букви "w" се използват за съвпадение на буквено-цифрови знаци, а големите букви "W" се използват за съвпадение на символи, които не са думи.

Синтаксис на квантификатора

Синтаксисът на квантификатора се използва за преброяване или количествено определяне на критериите за съвпадение. Например, ако искате да проверите дали даден низ съдържа дадена азбука един или повече пъти. Нека разгледаме някои от често използваните квантификатори в регулярните изрази.

Синтаксис на квантификатора Значение
* Този символ се използва за съвпадение с предходния символ.
+ Този символ се използва за съвпадение на един или повече символи в един ред.
{n} Цифровата цифра в къдравите скоби се използва за съответствие с номера на предходния символ, определен от цифровата цифра в къдравите скоби.
{n,} Числото в къдравите скоби и този символ се използват, за да се гарантира, че то съвпада с поне n (т.е. стойността на числото в скобите).
{n, m} Този символ се използва за съвпадение с предходния символ от n до m пъти.
? Този символ прави така, че предходните знаци да съвпадат като незадължителни.

Клас на персонажа

Класът на символите е известен също като набор от символи и се използва, за да се укаже на регекс енджина да търси едно съвпадение от няколко символа. Класът на символите ще съвпада само с един символ и редът на символите, затворени в набора от символи, няма значение.

Клас на героите Значение
[ обхват ] Символът за квадратна скоба се използва за съответствие на диапазон от символи. Например можем да го използваме, за да определим всеки символ в диапазона от азбуката "a" до "z", като заградим диапазона в скобата, както е [a-z]

Или можем да съпоставяме и с числата от "1" до "9", като обозначим [1-9]

[^ обхват] Това е класът на отрицателните символи. Използва се за съвпадение на всичко, което не е в обхвата, посочен в скобата.
\ Използва се за съвпадение на специални символи, които могат да имат свои собствени regex символи. Косовата черта се използва за съвпадение на специалните символи в буквалния им вид.

Групиране

Кръгли скоби или скоби могат да се използват за групиране на част от регулярния израз. Това позволява на потребителя да добави количествен показател към израза.

Групиране Значение
( групов израз ) Кръглите скоби се използват за групиране на израз.
Сайтът

Примери за регулярни изрази в C#

В предишния раздел се запознахме със символите на регулярните изрази, а в този раздел ще разгледаме подробно употребата на различните символи в регулярните изрази и комбинациите, в които те могат да се използват за съвпадение на различни изрази.

В този урок ще обсъдим някои от най-често срещаните сценарии от реалния живот, с които може да се сблъскате като разработчик, докато работите върху някое приложение или в проста програма за получаване на потребителски вход.

Пример за регулярни изрази с реални сценарии

Нека научим повече за регулярните изрази с помощта на някои примери в реално време.

Сценарий 1: Проверете дали входният низ е съставен от 6-цифрени азбучни знаци, без значение на големи и малки букви.

Най-често срещаният сценарий за регулярни изрази е намирането и съчетаването на дадена дума. Например, да кажем, че искам произволен буквен низ от потребителя и че входът трябва да бъде дълъг точно 6 цифри.

За да потвърдим това, можем да използваме прост регулярен израз. Нека напишем програма, за да разберем по-добре писането и използването на регулярен израз.

 public static void Main(string[] args) { string patternText = @"^[a-zA-Z]{6}$"; Regex reg = new Regex(patternText); /Когато моделът съвпада Console.WriteLine(reg.IsMatch("Helios")); /Когато моделът не съвпада Console.WriteLine(reg.IsMatch("Helo")); } 

Изход

Истински

Фалшив

Обяснение

В този пример се опитваме да валидираме входен низ, за да проверим дали съдържа шестцифрени буквени знаци. Знаците могат да бъдат както малки, така и големи, така че трябва да вземем предвид и това.

И така, тук дефинирахме шаблон на регулярен израз в променливата "patternText" и след това го предадохме в обекта regex. Следващите редове код са доста прости, използвахме метода IsMatch, за да сравним регулярния израз и входния низ.

Нека сега разгледаме регулярния израз, който разработихме. Изразът (^[a-zA-Z]{6}$) е съставен от 4 различни части: "^", "[a-zA-Z]", "{6}" и "$". Втората част обозначава съвпадащите символи, които се използват за извършване на съвпадение на израза, "a-z" за малки букви и "A-Z" за големи букви.

Символът "^" от първата част гарантира, че низът започва с шаблона, определен във втората част, т.е. малки и големи букви.

Къдравите скоби в третата част определят броя на символите в низа, които могат да бъдат идентифицирани по дефинирания шаблон, т.е. 6 в този случай, а символът "$" гарантира, че той завършва с шаблона, дефиниран във втората част.

^[a-zA-Z]{6}$

Сценарий 2: Използвайте регулярен израз, за да потвърдите, че думата, която започва със "Super" и има бял интервал след нея, т.е. да потвърдите дали "Super" присъства в началото на изречението.

Да предположим, че четем въведени от потребителя данни и трябва да се уверим, че потребителят винаги започва изречението си с определена дума, число или азбука. Това може да се постигне доста лесно с помощта на прост регулярен израз.

Нека разгледаме примерна програма и след това да обсъдим подробно как да напишем този израз.

 public static void Main(string[] args) { string patternText = @"^Super\s"; Regex reg = new Regex(patternText); /Когато шаблонът съвпада Console.WriteLine(reg.IsMatch("Супермен")); /Когато шаблонът не съвпада Console.WriteLine(reg.IsMatch("Супергерой")); } 

Изход

Истински

Фалшив

Обяснение

И в този пример използвахме подобна настройка на кода, както в първия. Шаблонът за регулярен израз в този сценарий изисква съвпадение с комбинация от думи или изречения, които започват със "Super".

^Супер

И така, тъй като искаме да съвпадаме от началото на поредицата от думи, ще започнем с поставянето на символа "^", след което ще дадем шаблона, който искаме да съвпада, в този случай "Super". Сега шаблонът, който създадохме "^Super", може да съвпада с всички стойности на super, дори superman или supernatural, но не искаме само думата "Super".

Това означава, че след думата трябва да има бяло пространство, за да се отбележи краят на думата и началото на друга дума. За да направим това, ще добавим символа "\s" към образеца и така ще направим окончателния си образец като

^Super\s

Сценарий 3: Използване на регулярен израз за намиране на валидни имена на файлове с разширение на тип файл изображение.

Друг важен сценарий в реално време, с който разработчиците често се сблъскват, е валидирането на типовете файлове. Да речем, че имаме бутон за качване в потребителския интерфейс, който може да приема само разширения на файлове от типа на изображенията.

Трябва да валидираме файла, който потребителят качва, и да го информираме, в случай че е качил файл с грешен формат. Това може лесно да се постигне с помощта на Regular expression.

По-долу е дадена проста програма за проверка на това.

 public static void Main(string[] args) gif)$"; Regex reg = new Regex(patternText); /Когато шаблонът съвпада Console.WriteLine(reg.IsMatch("abc.jpg")); Console.WriteLine(reg.IsMatch("ab_c.gif")); Console.WriteLine(reg.IsMatch("abc123.png")); /Когато шаблонът не съвпада Console.WriteLine(reg.IsMatch(".jpg")); Console.WriteLine(reg.IsMatch("ask.jpegj")); 

Изход

Истински

Истински

Истински

Фалшив

Фалшив

Обяснение

Тук трябва да съпоставим име на файл. Едно валидно име на файл се състои от три части ( име на файла + . + разширение на файла ). Трябва да създадем регулярен израз, който да съвпада и с трите части. Нека започнем със съвпадение на първата част, т.е. името на файла. Името на файла може да съдържа буквено-цифрови и специални символи.

Както беше обсъдено по-рано, символът за обозначаване на това е "\w". Също така името на файла може да бъде от един или повече знака, така че ще използваме символа "+". Комбинирайте ги и ще получите символа за първата част.

 (\w+) 

Скобата раздели това на части. Следващата част е символът точка. Тъй като символът точка има своето значение в регекса, ще използваме обратна наклонена черта пред него, за да му придадем буквално значение. Комбинирайте двете и ще покрием първите две части на регекса.

 (\w+)\. 

Сега, за третата и последна част, можем директно да дефинираме необходимите файлови разширения, разделени с "

 (\w+)\.(jpg 

Сега, ако използваме това в програмата, ще видим, че то отговаря на правилния формат и връща true, но при невалидни формати връща false.

Сценарий 4: Използване на регулярен израз за потвърждаване на формата на адреса на уебсайта

Да предположим, че имаме уеб формуляр, който приема уеб адрес или адрес на домейн. Искаме потребителят да въведе правилния уеб адрес/адрес на домейн, докато попълва формуляра. За да определим дали потребителят е въвел правилен уеб адрес, регулярен израз може да бъде доста полезен.

 public static void Main(string[] args) { string patternText = @"^www.[a-zA-Z0-9]{3,20}.(com 

Изход

Истински

Фалшив

Обяснение

Тук искаме да съпоставим валидно име на домейн с помощта на регулярен израз. Валидното име на домейн започва със съкращението "www", последвано от точка (.), след това името на уебсайта, след това точка (.) и накрая разширение на домейна.

Така че, подобно на предишния сценарий, ще се опитаме да го съвпаднем част по част. Нека първо започнем със съвпадение на частта "www.". Така че започваме с началния символ, а след това като "www." Това е нещо, което е фиксирано, така че използваме началния символ, последван от точните думи за съвпадение.

 "^www." 

След това ще започнем работа по втората част. Втората част на уеб адреса може да бъде всяко буквено-цифрово име. Така че тук ще използваме квадратни скоби, присъстващи в класа на символите, за да определим обхвата, който трябва да бъде съпоставен. След като добавим втората част с втората част, ще получим.

 “^www.[a-zA-Z0-9]{3,20}” 

Тук добавихме и къдрави скоби, за да определим минималната и максималната дължина на символите за името на уебсайта. Зададохме минимална дължина от 3 и максимална от 20. Можете да зададете всякаква минимална или максимална дължина, която искате.

Сега, след като обхванахме първата и втората част на уеб адреса, ни остава само последната част, т.е. разширението на домейна. Това е доста сходно с това, което направихме в последния сценарий, като ще съпоставим директно с разширенията на домейна, като използваме ИЛИ и заградим всяко валидно разширение на домейна в кръгла скоба.

Така, ако ги съберем, ще получим пълен регулярен израз, който може да съответства на всеки валиден уеб адрес.

 www.[a-zA-Z0-9]{3,20}.(com 

Сценарий 5: Използване на регулярен израз за валидиране на формат на имейл идентификатор

Да предположим, че имаме форма за влизане в нашата уебстраница, която изисква от потребителите да въведат своя имейл адрес. По очевидни причини няма да искаме нашата форма да продължи с невалидни имейл адреси. За да потвърдим дали имейл адресът, въведен от потребителя, е правилен или не, можем да използваме регулярен израз.

По-долу е дадена проста програма за валидиране на имейл адрес.

 public static void Main(string[] args) { string patternText = @"^[a-zA-Z0-9\._-]{5,25}.@.[a-z]{2,12}.(com 

Изход

Истински

Истински

Фалшив

Обяснение

Валидният имейл адрес съдържа азбуки, цифри и някои специални знаци, като точка (.), тире (-) и долна черта (_), последвани от символа "@", след който се изписва името на домейна и разширението на домейна.

По този начин можем да разделим имейл адреса на четири части, т.е. имейл идентификатор, символ "@", име на домейн и последното е разширението на домейна.

Нека да започнем с написването на регулярен израз за първата част. Той може да бъде буквено-цифров с някои специални символи. Да приемем, че имаме размер на израза от 5 до 25 символа. Подобно на начина, по който го написахме по-рано (в сценария с имейла), можем да измислим следния израз.

 ^[a-zA-Z0-9\._-]{5,25} 

Сега преминаваме към втората част. Тя е сравнително лесна, тъй като трябва да съпоставим само един символ, т.е. "@". Като го добавим към горния израз, получаваме.

 ^[a-zA-Z0-9\._-]{5,25}.@ 

Преминаваме към третата част, т.е. името на домейна винаги ще бъде поредица от малки буквени знаци. Ако искате, можете да включите и цифрови или главни буквени знаци, но за този сценарий ще използваме малки букви.

Ако добавим израза за малки букви с дължина от 2 до 12 знака, ще получим следния израз.

 ^[a-zA-Z0-9\._-]{5,25}.@.[a-z]{2,12} 

Сега оставаме само с израза за разширение на домейна, подобно на четвъртия сценарий, ще обработваме някои специфични разширения на домейни. Ако искате, можете да добавите още от тях, като ги затворите в кръгла скоба и ги разделите със символа "

Консолидирането на този израз с предишния израз ще ни даде крайната стойност на израза за валидиране на имейл.

 ^[a-zA-Z0-9\._-]{5,25}.@.[a-z]{2,12}.(com 

Заключение

В този урок научихме какво е регулярен израз, както и синтаксиса/символите, които се използват за означаване и конструиране на регулярен израз. Регулярният израз позволява на потребителя да съпостави низ с даден шаблон.

Това е доста полезно в ситуации, които изискват бързо валидиране на въведените данни, като например когато потребителят въвежда своя имейл адрес или телефонен номер, regex може да се използва за бързо валидиране на формата и информиране на потребителя за проблема, ако потребителят е въвел грешен формат.

Научихме се също така да се справяме с различни сценарии, които могат да се използват за различни приложения. Разгледахме стъпка по стъпка процеса за писане на изрази за съвпадение на думи, азбуки, адреси на уебсайтове, идентификатори на имейли и дори типове и разширения на файлове.

Тези сценарии са доста полезни за валидиране на потребителските входове в реално време, без да се пишат многобройни редове код, и по този начин спомагат за спестяване на време и намаляване на сложността. Тези примери са използвани, за да насочат потребителя да създаде свой собствен набор от регулярни изрази и по този начин да му помогнат да се справи с няколко други различни сценария.

Регексът може да бъде прост, като например използване на азбука или цифри за съвпадение с дадена поредица от символи, или сложен, като се използва комбинация от специални символи, квантификатори, класове символи и т.н. за потвърждаване на сложни формати или за търсене на специфичен модел в поредицата от символи.

Накратко, регулярният израз е доста мощен инструмент за програмиста и помага да се намали количеството код, което е необходимо за изпълнение на задача за сравняване на данни или валидиране.

Превъртете към горе