10 октомври 2008

Регулярни изрази

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

Силата на доброто записване надминава традиционното програмиране и стига до специфични проблеми домейни. HTML ни позволява да създаваме интерактивни документи, често използвайки вградени програми на други езици като JavaScript. PostScript изразява цял документ като специализиран програма. Електронните таблици и текстовите редактори често съдържат езици за изпълняване на изрази, достъп до информация и контрол.

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

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

del *.exe

използва шаблон "*.exe" ,който съвпада с всички файлове, чиито имена съдържат какъв да е низ, следван от низа ".exe".

Регулярните изрази са навсяйъде в UNIX - в редактори, инструменти като grep и скриптови езици като Awk, Perl и Tcl. Въпреки че от вариациите в различните програми може да се предположи, че регулярните изрази са ад хок механизъм, те всъщност са език със силно техническо чувство - неговата структура се определя от формална граматика и всеки израз има точно определено значение. Като допълнение - правилната реализация може да върви много бързо, комбинацията от теория и инженерна практика дава много добри резултати.

Езикът на регулярните изрази

Регулярен израз е поредица от символи, които определят шаблон. Повечето символи в шаблона просто се съпоставят на тях самите в низ, например регулярния израз "abc" съвпада с поредица от три символа, където и да е в проверявания низ. Няколко символа се изпозват като метасимволи за означаване на повторение, групиране или позициониране. В регулярни изрази POSIX "^" означава началото на низа, "$" е краят, например "^x" съвпада с "x" само в началото на низ "x$" съвпада с "x" само в края, "^x$" съвпада с "x" само ако е единствен символ в низа и "^$" е празен низ.

Символът "." (точка) съвпада с всеки символ, например "x.y" съвпада с "xay," "x2y," и така нататък но не на "xy" или "xyxy." Регулярният израз "^.$" съвпдада с низ, който съдържа който и да е единичен символ.

Сбор ор символи в скоби "[]" съвпада с всеки един от затворените в скоби символи, например "[0123456789]" съвпада с цифра. Този шаблон може да бъде записан кратко "[0-9]."

Тези градивни елементи могат да се комбинират със скоби за групиране, "|" за алтернатива, "*" нула или повече срещания, "+" за едни или повече срещания и "?" за нула или едни срещания. Последният символ "\" се използва като префикс за премахване на специалното значение на метасимволите.

Тези символи могат да бъдат комбинирани в забележително големи шаблони. Например "\.[0-9]+" съвпада с точка, следвана от една или повече цифри; "[0-9]+\.?[0-9]*" съвпада с една или повече цифри, следвани от незадължителна точка и нула или повече цифри; "(\+|-)" съвпада с плюс или минус ("\+" е символът за занк плюс) и "[eE](\+|-)?[0-9]+" съвпада с "e" или "E" , следвано от незадължителен знак и една или повече цифри. След комбинирането им се получава шаблон за числа с плаваща запетая:

(\+|-)?([0-9]+\.?[0-9]*|\.[0-9]+)([eE](\+|-)?[0-9]+)?

Няма коментари:

Публикуване на коментар