Автор Тема: Регулярни изрази част 1  (Прочетена 658 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

abcd

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 10
  • -Получени: 46
  • Публикации: 358
Регулярни изрази част 1
« -: 18 Януари 2012, 21:45:18 »
Регулярните изрази по същество са един миниатюрен, високо специализиран език за програмиране.Използвайки този миниезик, вие определяте правилата, по които искате да подберете един набор от възможни пасващи символни низове.Този набор може да съдържа изречения на български, e-mail адреси или каквото пожелаете. По този начин можете да задавате въпроси от типа на: Дали този символен низ пасва на образеца?, или Съществува ли съвпадение с образеца някъде из този символен низ? Също така можете да използвате регулярните изрази за да модифицирате един символен низ или за да го разцепите по най-различни начини.

Започваме с един прост пример за регулярен израз:

Код: PHP
  1. $pattern='/hello/';

Така написан шаблона ни(hello) ще пасне(ще намери съвпадение) точно един път и точно със символния низ hello независимо дали той съдържа други символи или само тези, тоест ако имаме "hellohello" регулярния израз ще намери първото съвпадение и ще спре до там: hellohello
Важно е да се отбележи, че шаблоните са чувствителни към регистъра,казано разбираемо правят разлика между малки и големи букви,разбира се това може да се избегне по много начини,но за тях по-късно.
Да започнем с основите на регулярните изрази така наречените метасимволи(специални символи,наречени още магически):

^ $ . * + ? { } [ \ | ( )

С какво те са по-различни от всички други символи? - ами имат определено значение тоест изпълняват определени задачи.
Започваме с първия метасимвол "^"(caret,коректорски знак) - какво значение има той ? - ами оказва началото на символния низ:

Код: PHP
  1. $pattern='/^hello/';

Ако използваме предишния символен низ "hellohello" регулярния израз ще намери същото съвпадение(hellohello), но то трябва задължително да е в началото на низа(всяко пространсво - интервал,табулация и т.н или символи отпред ще попречат да намери съвпадение).Точно това е разликата между този шаблон и предишния.При предишния не сме оказли изрично къде да се намира символния низ, който търсим дали е в началото или не и затова при него ще намери съвпадение независимо къде се намира той ако има такъв.Използван в клас([^hp]) обаче изразява отрицание тоест не допуска използването в случая на "h" и "p" в символния низ, но за тази особеност ще поговорим в друг урок.

Метасимвола "$" (dollar,долар) е абсолютно идентичен като "^" само че той оказва края на символния низ :

Код: PHP
  1. $pattern='/hello$/';


Резултата както може би сами се досещате ще бъде: hellohello

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

Код: PHP
  1. $pattern='/^hello$/';

Ако изпозлваме отново символния низ от по-горе то няма да се намери съвпадение: hellohello
Точно затова са често използвани заедно за валидация на input полета или на get параметри.

Следващия "." (dot,точка) съвпада с един произволен символ(интервали,табулации и други пространства (без нов ред) или който и да е символ).Ще използваме отново същия символен низ по-горе:

Код: PHP
  1. $pattern='/./';


Резултата : hellohello

Другия метасимвол "*" (star,звезда) характеризира броя съвпадения, които ще открие регулярния израз - точно този прави следното: намира нула или повече съвпадения,тоест намирането на съвпадение на даден символ преди звездичката е незадължително.
Ще използваме за този пример символния низ: "heo"

Код: PHP
  1. $pattern='/hel*o/';

В случая задаваме правило: когато се стигне до символа "l" да провери за нула или повече негови съвпадения,ако няма както е в случая то да продължава да търси за съвпадение по останалите символи.

Резултата : heo

Метасимвола "+" (plus,плюс) е подобен на предишния,но има една значителна разлика - тук трябва да се намери задължително поне едно съвпадение с предишния символ и повече.Ако изпозлваме горния пример няма да открие съвпадение защото вместо "heo" регулярния израз търси "helo" или "hello" и изобщо "he(безброй много "l")o"

Код: PHP
  1. $pattern='/hel+o/';

Резултата със символен низ "helllllo": helllllo

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

Следващия "?" (question mark,въпросителен знак) е подобен на "*" с разликата, че тук се търсят нула или само едно съвпадение.Със следващия израз символния низ "heo" или "helo" ще бъде открит от регулярния израз но не и "hello" защото имаме повече от едно съвпадение на символа "l" пред метасимвола.Този метасимвол се използва също и за ограничаване на алчните.("+","*").

Код: PHP
  1. $pattern='/hel?o/';

Резултата със символен низ "helllllo": helllllo

Ако искаме да ограничим повторението на съвпаденията,тоест да направим някакъв интервал от х броя до y броя то изплзваме фигурните скоби "{x,y}".Вариянтите за създаване на такъв интервал са няколкo :
1.Имаме начална стойност(брой повторения), но нямаме крайна(до безкрайност) - {1,} (в този случай е идентично на "+")
2.Имаме начална, и крайна - {1,5}
3.Имаме точно определен брой повторения(нито повече,нито по-малко) - {3}

Код: PHP
  1. $pattern='/hel{1,3}o/';


Резултат с "hello": hello

За останалите метасимволи,с повече примери ще поговорим в следващия урок.
Използвайте preg_match за тестване в php или някой engine. (@HD е споделил един добър тук като при него наклонените черти обграждащи шаблона (/pattern/) се генерират автоматично и не е нужно да ги слагате)

Към следващия урок.
« Последна редакция: 23 Януари 2012, 20:50:38 от abcd »

carrie

  • Newbie
  • *
  • Благодарности
  • -Казани: 1
  • -Получени: 0
  • Публикации: 8
Re: Регулярни изрази част 1
« Отговор #1 -: 13 Март 2012, 16:59:09 »
Здравей!

Искам да попитам как мога да напиша един регулярен израз, който да ми проверява имена като например това: Мария Иванова заедно с интервала, дали е написано на кирилица?
« Последна редакция: 13 Март 2012, 17:08:54 от vdimova »

abcd

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 10
  • -Получени: 46
  • Публикации: 358
Re: Регулярни изрази част 1
« Отговор #2 -: 13 Март 2012, 18:47:15 »
Здравей! Искам да попитам как мога да напиша един регулярен израз, който да ми проверява имена като например това: Мария Иванова заедно с интервала, дали е написано на кирилица?

Ами зависи каква кодирoвка използваш, ако си с ANSI долния пример би ти свършил работа:
/^(?:[а-яА-Я]+ ?)+$/Ако си с UTF8 ти предлагам да го направиш с POSIX клас, при който трябва да добавиш и флага(режима) "u" :
/^(?:\p{Cyrillic}+ ?)+$/uДобре е да прочетеш всички уроци ако има нещо неясно и да видиш примера за имена, който съм дал в тази тема.Този израз, който ти написах за разлика от израза в другата тема не е стриктен по отношение на това колко букви трябва да има в името и колко пъти да се повтаря то а проверява дали има една или повече букви от кирилицата като прихваща и единичен интервал между тях.

Успех!

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

carrie

  • Newbie
  • *
  • Благодарности
  • -Казани: 1
  • -Получени: 0
  • Публикации: 8
Re: Регулярни изрази част 1
« Отговор #3 -: 14 Март 2012, 10:48:58 »
Вторият пример ми свърши перфектна работа. Благодаря много за помощта.  ;)
Езикът на който пиша е PHP и използвам preg_match.