Регулярните изрази по същество са един миниатюрен, високо специализиран език за програмиране.Използвайки този миниезик, вие определяте правилата, по които искате да подберете един набор от възможни пасващи символни низове.Този набор може да съдържа изречения на български, e-mail адреси или каквото пожелаете. По този начин можете да задавате въпроси от типа на: Дали този символен низ пасва на образеца?, или Съществува ли съвпадение с образеца някъде из този символен низ? Също така можете да използвате регулярните изрази за да модифицирате един символен низ или за да го разцепите по най-различни начини.
Преди да започнем, нека уточня, че използвам за програмен език
php,съответно и
PCRE функции-те за боравене с регулярни изрази, при които шаблоните ни от регулярни изрази задължително се обграждат с разделители(в случая съм използвал backslashes "
/").За примерите по-долу може да използвате
preg_match за тестване в php или някой engine.(Наш съфорумник е споделил един добър
тук като при него наклонените черти обграждащи шаблона (/pattern/) се генерират автоматично и не е нужно да ги слагате)
Започваме с един лесен пример за регулярен израз:
Така написан шаблона ни
hello ще пасне(ще намери съвпадение) точно един път и точно със символния низ
hello, независимо дали той съдържа други символи или само тези, тоест ако имаме символен низ
hellohello регулярния израз ще намери първото съвпадение и ще спре до там:
Резултатa:
hellohello
Казано по-точно, ако енджина, който борави с регулярните изрази открие съвпадение с шаблона ни
символ по символ (проверява първо за съвпадение със символ
h,ако се намери проверява за следващия
e и т.н.),ще върне успех като резултат от търсенето.
Важно е да се отбележи, че шаблоните са чувствителни към регистъра,казано разбираемо правят разлика между малки и големи букви,разбира се това може да се избегне по много начини,но за тях по-късно.
Да започнем с основите на регулярните изрази така наречените метасимволи(специални символи,наречени още магически):
^ $ . * + ? { } [ \ | ( )С какво те са по-различни от всички други символи? - ами имат определено значение тоест изпълняват определени задачи.
Започваме с първия метасимвол "
^"(
caret,коректорски знак) - какво значение има той ? - ами оказва началото на символния низ:
Ако използваме предишния символен низ "hellohello" регулярния израз ще намери същото съвпадение(
hellohello), но то трябва задължително да е в началото на низа(всяко пространсво - интервал,табулация,нов ред или други непространствени символи отпред ще попречат да намери съвпадение).Точно това е разликата между този шаблон и предишния.При предишния не сме оказли изрично къде да се намира символния низ, който търсим дали е в началото или не и затова при него ще намери съвпадение независимо къде се намира той.Използван в началото на клас([^hp]) обаче изразява отрицание тоест търси се съвпадение на сивмоли различни в случая от "h" или "p" в символния низ, но за тази особеност ще поговорим в друг урок.
Метасимвола "
$" (
dollar,долар) е абсолютно идентичен като "^" само че той оказва края на символния низ :
Резултата както може би сами се досещате ще бъде: hello
helloАко използваме заедно и двата метасимвола то създаваме правило, което казва че символния низ трябва да започва и съответно да завършва с шаблона ни.
Ако изпозлваме отново символния низ от по-горе то няма да се намери съвпадение: hellohello
Точно затова са често използвани заедно за валидация на input полета или на get параметри.
Следващия "
." (
dot,точка) съвпада с един произволен символ(интервали,табулации и други пространства (без нов ред) или който и да е друг символ).Ще използваме отново същия символен низ по-горе:
Резултата :
hellohello
Другия метасимвол "
*" (
star,звезда) характеризира броя съвпадения, които ще открие регулярния израз - точно този прави следното: намира нула или повече съвпадения,тоест намирането на съвпадение на даден символ преди звездичката е
незадължително.
Ще използваме за този пример символния низ: "heo"
В случая задаваме правило: когато се стигне до символа "l" да провери за нула или повече негови съвпадения,ако няма както е в случая то да продължава да търси за съвпадение по останалите символи.
Резултата :
heoМетасимвола "
+" (
plus,плюс) е подобен на предишния,но има една значителна разлика - тук трябва да се намери
задължително поне едно съвпадение с предишния символ и повече.Ако изпозлваме горния пример няма да открие съвпадение защото вместо "heo" регулярния израз търси "helo" или "hello" и изобщо "he(безброй много "l")o"
Резултата със символен низ "helllllo":
hellllloВажно е да се отбележи, че тези два метасимвола "
*" и "
+" се наричат "алчни", защото могат да открият безброй много съвпадения и трябва да се внимава с употребата им.
Следващия "
?" (
question mark,въпросителен знак) е подобен на "*" с разликата, че тук се търсят нула или само едно съвпадение.Със следващия израз символния низ "heo" или "helo" ще бъде открит от регулярния израз но не и "hello" защото имаме повече от едно съвпадение на символа "l" пред метасимвола.Този метасимвол се използва също и за ограничаване на алчните.("+","*").
Резултата със символен низ "helllllo": helllllo
Ако искаме да ограничим повторението на съвпаденията,тоест да направим някакъв интервал от х броя до y броя то изплзваме фигурните скоби "
{x,y}".Вариянтите за създаване на такъв интервал са няколкo :
1.Имаме начална стойност(брой повторения), но нямаме крайна(до безкрайност) - {1,} (в този случай е идентично на "+")
2.Имаме начална, и крайна - {1,5}
3.Имаме точно определен брой повторения(нито повече,нито по-малко) - {3}
Резултат с "hello":
helloЗа останалите метасимволи,с повече примери ще поговорим в следващия урок.
--> Към следващия урок.