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

Из Википедије, слободне енциклопедије
Иди на навигацију Иди на претрагу

У рачунарству и информатици, регуларни израз (још и правилан израз, исправан израз - енгл. скр. regexp или regex, у множини regexps, regexes или regexen) је ниска која описује или спарује скуп ниски, у складу с одређеним синтаксним правилима. Регуларне изразе користе многи текст едитори и помоћни програми за претрагу и манипулацију текста. Многи програмски језици подржавају регуларне изразе за манипулисање нискама. На пример, Perl и Tcl имају моћан мотор за регуларне изразе уграђен директно у синтаксу. Скуп помоћних програма (укључујући уређивач sed и филтер grep) који се стандардно дистрибуира са јуникс дистрибуцијама је много учинио на промоцији и популаризацији концепта регуларних израза.

Основни концепти[уреди]

Регуларни израз, често зван узорак или патерн, је израз који описује скуп ниски. Уобичајено се користе за давање концизног описа скупа, без потребе за набрајањем свих његових елемената. На пример, скуп који садржи све три ниске Handel, Händel, и Haendel се може описати узорком "H(ä|ae?)ndel" (или алтернативно, каже се да узорак спарује (енгл. match) сваку од три ниске. У већини формализама, ако постоји регуларни израз који спарује одређени скуп, тада постоји и бесконачан скуп таквих израза. Већина формализама пружа следеће операције приликом конструкције регуларних израза:

алтернација
Усправна црта раздваја алтернативе. На пример "gray|grey" се може скратити у истоветан израз "gr(a|e)y", и при томе спарити gray или grey.
груписање
Заграде се користе за дефинисање подручја деловања (енгл. scope) и предности оператора. На пример, "gray|grey" и "gr(a|e)y" су различити узорци, али обоје описују скуп који садржи gray или grey.
Квантификација
Квантификатор након знака или скупа њих одређује учесталост појављивања израза који претходи. Најчешће коришћени квантификатори су ?, *, и +:
?
Упитник означава да појављивање претходног израза нула пута или једанпут. На пример, colou?r спарује и "color" и "colour".
*
Звездица (енгл. asterisk) означава појављивање претходног израза нула пута, једанпут или било који већи број пута. На пример, "go*gle" спарује ggle, gogle, google, gooogle, итд.
+
Знак плус означава појављивање претходног израза барем једном. На пример, "go+gle" спарује gogle, google, gooogle, итд. (али не и ggle).

Ове елементарне конструкције се могу комбиновати у произвољно сложене изразе, слично начину на који се могу конструисати аритметички изрази из бројева и операција +, -, * и /.

Стога су "H(ae?|ä)ndel" и "H(a|ae|ä)ndel" исправни узорци, и штавише, оба спарују исте ниске баш попут примера са почетка чланка. Узорак "((great )*grand )?((fa|mo)ther)" спарује било који од ниски које у енглеском језику означавају претке father, mother, grand father, grand mother, great grand father, great grand mother, great great grand father, great great grand mother, great great great grand father, great great great grand mother и тако даље.

Прецизна синтакса регуларних израза варира од алата до алата и подручја примене - више детаља је дато у секцији Синтакса.

Историја[уреди]

Порекло регуларних израза лежи у теорији аутомата и теорији формалних језика, при чему су обе дисциплине теоретског рачунарства. Ове дисциплине проучавају моделе рачунања (аутомате) те начине описа и класификације формалних језика. Математичар Stephen Kleene је 1950-их описао ове моделе користећи математичку нотацију названу регуларни скупови. Ken Thompson је уградио ову нотацију у уређивач QED, а потом и у јуникс едитор ed, што је с временом довело до употребе регуларних израза у grep-у. Отад се регуларни изрази нашироко користе у јуниксу и јуниксоидним помоћним програмима као што су expr, awk, Emacs, vi, lex и Perl.

Perl и Tcl регуларни изрази су изведени из регеx библиотеке коју је написао Henry Spencer, иако је Perl касније проширио Spencer-ову регеx библиотеку и додао много нових својстава.[1] Philip Hazel је развио PCRE (Perl Compatible Regular Expressions) који јако добро опонаша функционалност регуларних израза у Perl-у, и којег користе многи модерни програмски алати као што су PHP, ColdFusion, и Apache. Део напора уложеног у дизајн Perla 6 је баш у смеру побољшања интеграције Perl-ових регуларних израза, те повећању њиховог подручја деловања у сврху дозволе дефиниције тзв. 'parsing expression grammar [2]'. Резултат је мини-језик назван [[Perl 6 правила]], која се користе како за дефиницију граматике Perl-а 6 тако и као алат Perl програмерима. Ова правила чувају сва својства регуларних израза, али и дозвољавају дефиниције у БНФ стилу парсера техником рекурзивног спуста преко потправила.

Кориштење регуларних израза у структурираним информационим стандардима (за моделирање докумената и база података) се показало врло важним, почевши од 1960-их те се проширујући 1980-их консолидацијом индустриских стандарда као што је ISO SGML. Језгра стандарда језика спецификације структуре су регуларни изрази. Једноставнија и евидентнија употреба је у групној синтакси DTD-а.

Формална теорија језика[уреди]

Регуларни изрази могу бити изражени преко формализма теорије формалних језика. Регуларни се изрази састоје од константи и оператора који означавају скупове ниски и операција над тим скуповима. За дату абецеду , следеће константе су дефинисане:

  • (празан скуп) који означава
  • (празна ниска) који означава скуп
  • (литерални карактер) а у који означава скуп {а}

те следеће операције:

  • (надовезивање или конкатенација) RS означава скуп { αβ | α у R и β у S }. На пример {ab, c}{d, ef} = {abd, abef, cd, cef}.
  • (алтернација) R|S означава унију скупова R и S.
  • (Клинијев оператор) Р* означава најмањи надскуп од R који садржи и затворен је за надовезивање ниски. Ово је скуп свих ниски који могу бити начињени надовезивањем нула или више ниски у R. На пример, {ab, c}* = {ε, ab, c, abab, abc, cab, cc, ababab, ... }.

Горње константе и оператори обликују Клеенеову алгебру.

Многи уџбеници користе симболе , + или за алтернацију уместо вертикалне црте.

Да би се избегло кориштење заграда, претпоставља се да Клеенеов оператор има највећу предност, а потом следе надовезивање и на крају унија скупова. Уколико не постоји неједнозначност, заграде се могу одбацити. На пример, "(ab)c" се пише као "abc" и "a|(b(c*))" може бити записано као "a|bc*".

Примери:

  • "a|b*" означава {ε, a, b, bb, bbb, ...}
  • "(a|b)*" означава скуп свих ниски који се састоје од било ког броја симбола a и b, укључујући празну ниску
  • "b*(a|b*)*" исто као претходни пример
  • "ab*(c|ε)" означава скуп свих ниски који почињу симболом a, након којег следи нула или више симбола b те коначно опционо c.
  • "(aa|ab(bb)*ba)*(b|ab(bb)*a)(a(bb)*a|(b|a(bb)*ba)(aa|ab(bb)*ba)*(b|ab(bb)*a))* "означава скуп свих ниски које садрже паран број симбола a и непаран број симбола b

Формална дефиниција регуларних израза је с намером штура и избегава дефинисање заменљивих квантификатора ? и +, који пак могу бити изражени на следећи начин: a+ = aa*, и a? = (ε|a). Понекад се додаје оператор комплементирања ~, тако да ~R означава скуп свих ниски над Σ* који нису у R. Оператор комплементирања је заменљив - увек се може изразити кориштењем других оператора (процес рачунања таквог представљања је сложен, а резултат може бити експоненцијално већи, али је ипак могућ).

Регуларни изрази у овом смислу могу изразити тачно класу језика коју прихватају коначни аутомати - регуларне језике. Међутим, постоји значајна разлика у компактности - неке класе регуларних језика могу бити описане аутоматима који расту експоненцијално у величини, док дужина захтеваних регуларних израза расте линеарно. Регуларни изрази одговарају трећем типу граматика хијерархије Чомског и могу бити кориштени за опис регуларног језика. С друге стране, постоји једноставно пресликавање између регуларних израза и недетерминистичких коначних аутомата (НКА) које не води ка толиком расту величине. То је главни разлог кориштења НКА као алтернативног начина представљања регуларних израза.

Такође се може проучавати изражајну моћ унутар формализма. Као што пример показује, различити регуларни изрази изражавају исти језик - формализам је заменљив.

Могуће је написати алгоритам који за два дата регуларна израза испитује једнакост описаних језика, тако што редукује сваки израз на минимални детерминистички коначни аутомат и потом испитује изоморфност њихових графова дијаграма стања.

До ког нивоа се ова заменљивост може елиминисати? Може ли се наћи занимљив подскуп регуларних израза који је још увек потпуно изражајан? Клеенеов оператор и унија скупова су очигледно међу захтеваним операцијама, али можда њихова употреба може бити ограничена. Ово се показало као зачуђујуће тежак проблем. Колико год једноставни регуларни изрази били, показало се да не постоји метода њиховог систематског преписивања у неки нормални облик. Они нису коначно аксиоматизабилни, те стога морамо прибећи другим методама. Ово води до проблема висине звезде.

Синтакса[уреди]

Традиционални регуларни изрази на јуниксу[уреди]

"Основна" синтакса регуларних израза на јуниксу је данас застарела по POSIX дефиницијама, иако се нашироко користи због компатибилности уназад. Већина помоћних програма на јуниксу свесних регуларних израза, као што су grep и сед, користе их подразумевано, док пружају подршку за проширене регуларне изразе преко команднолиниских аргумената (видети доле).

У основној синтакси, са већином се карактера поступа дословно (као завршним знаковима) - спарују се само са собом самима (тј. "a" спарује a, "(bc" спарује (bc, итд).

. Спарује било који карактер само једном. Унутар [] има своје уобичајено значење. На пример, "a.cd" спарује abcd, "a..d" спарује abcd.
[] Спарује један карактер садржан унутар угластих заграда. На пример, "[abc]" спарује a, b или c. "[a-z]" спарује сва мала слова. Ова се два стила могу и мешати: "[abcq-z]" спарује a, b, c, q, r, s, t, u, v, w, x, y, z, баш као и "[a-cq-z]".

Карактер '-' би требало да буде схваћен дословно (као литерал) само ако је први или посљедњи карактер унутар заграда: "[abc-]" или "[-abc]". Да би се спарили карактери '[' или ']', најлакше је затварајућу угласту заграду поставити прву у обухватајућим угластим заградама: "[][-{аб}]" спарује ], [, а или б.

[^] Спарује један карактер који није садржан унутар угластих заграда. На пример, "[^абц]" спарује било који карактер осим а, б, и ц. "[^а-з]" спарује било који карактер који није мало слово. Баш као у претходним примерима, ови се стилови могу мешати.
^ Спарује почетак линије (било које линије, кад је примењен у вишелинијском начину рада)
$ Спарује крај линије (било које линије, кад је примењен у вишелиниском начину рада)
( ) Дефинише "означени подизраз". Што заградама обухваћени израз спарује може касније бити дохваћено - видети следећи унос за \н. "Означени подизраз" је такође "блок". Ова особина није присутна у неким инстанцама регеxа. У већини помоћних програма на јуниксу (као што су [[сед]] и [[ви]]), карактер "\" (енгл. бацксласх) мора претходити отвореним и затвореним заградама.
\н При чему н замењује број од 1 до 9 - спарује н-ти спарени означени подизраз. Ова конструкција је теоретски нерегуларна и није прихваћена у проширеној синтакси регуларних израза.
* Израз од једног карактера након којег следи "*" спарује нула или више копија себе. На пример, "аб*ц" спарује ац, абц, абббц итд. "[xyз]*" спарује празну реч, x, y, зx, зyx, и тако даље.
  • \н*, при чему н замењује број од 1 до 9, спарује нула или више итерација н-тог спареног означеног подизраза. На пример, "(а.)ц\1*" спарује абцаб и абцабаб, али не и абцац.
  • Израз затворен у "\(" и "\)" након чега следи "*" је неисправан. У неким случајевима (нпр. /уср/бин/xпг4/греп на СунОС 5.8), спарује једну или више итерација ниске које заградама обухваћени израз спарује. У другим случајевима, (нпр. /уср/бин/греп на СунОС 5.8), спарује оно што заградама обухваћени израз спарује, након чега следи литерални карактер "*".
+ Израз од једног карактера након којег следи "+" спарује једну или више копија израза. На пример, "аб+ц" спарује абц, абббц итд. "[xyз]+" спарује x, y, зx, зyx, и тако даље.
  • \н+, при чему н замењује број од 1 до 9, спарује једну или више итерација онога што спарује н-ти означени подизраз.
  • Израз обухваћен са "\(" и "\)" након којег следи "+" је неисправан.
{x,y} Спарује посљедњи блок барем x и не више од y пута. На пример, "а\{3,5}" спарује ааа, аааа или ааааа. Ова конструкција није присутна у неким инстанцама регеxа.

Неке интерпретације регуларних израза интерпретирају бацксласх карактер различито испред неких метакарактера. На пример, егреп и Перл интерпретирају заграде и вертикалне црте којима не претходи бацксласх као метакарактере, резервишући верзију у којима претходи у сврху значења литералних карактера. Старије верзије програма греп нису подржавале оператор алтернације "|".

Примери:

".ат" спарује било коју ниску од три карактера попут хат, цат или бат
"[хц]ат" спарује хат и цат
"[^б]ат" спарује све спарене ниске из регуларног израза ".ат" изузев бат
"^[хц]ат" спарује хат и цат али само на почетку линије
"[хц]ат$" спарује хат и цат али само на крају линије

Будући да многи опсези карактера зависе о специфично одабраним језичким поставкама (нпр., у неким поставкама су слова уређена као абц..yзАБЦ..YЗ док у неким другим као аАбБцЦ..yYзЗ), ПОСИX стандард дефинише неке разреде или категорије карактера као што је приказано следећом таблицом:

ПОСИX разред слично изразу значење
[:уппер:] [А-З] велика слова
[:лоwер:] [а-з] мала слова
[:алпха:] [А-За-з] велика и мала слова
[:алнум:] [А-За-з0-9] бројеви, велика и мала слова
[:дигит:] [0-9] бројеви
[:xдигит:] [0-9А-Фа-ф] хексадецимални бројеви
[:пунцт:] [.,!?:...] интерпункција (правописни знакови)
[:бланк:] [ \т] празнина (енгл. спаце) и ТАБ
[:спаце:] [ \т\н\р\ф\в] празнински карактери (енгл. wхитеспаце)
[:цнтрл:] контролни карактери
[:грапх:] [^ \т\н\р\ф\в] карактери који се могу графички исписати
[:принт:] [^\т\н\р\ф\в] карактери који се могу графички исписати и карактер празнине

На пример: [[:уппер:]]аб] би требало спарити само велика слова и мала слова 'а' и 'б'.

Договором је прихваћено да се разред [:принт:] састоји од разреда [:грапх:] уз придодат карактер празнине (спаце). Међутим, у Перл-овим регуларним изразима [:принт:] спарује унију разреда [:грапх:] и [:спаце:].

Додатни разред кога ПОСИX не дефинише, а кога неки алати разумеју је [:wорд:], који се обично дефинише као разред [:алнум:] са придоданим карактером "_" (енгл. ундерсцоре). Ово одражава чињеницу да је овако проширен разред кориштен у многим програмским језицима као скуп карактера дозвољен у називима идентификатора. Уређивач вим још разликује и разреде wорд и wорд-хеад (користећи нотацију \w и \х) пошто у многим програмским језицима карактери којима називи идентификатора могу започињати нису исти као и карактери који могу бити садржани на осталим позицијама назива идентификатора.

(За обојени АСЦИИ дијаграм који приказује ПОСИX разреде погледати

Похлепни изрази[уреди]

Квантификатори у регуларним изразима спарују колико год могу - похлепни су (што значи да покушавају спарити највећи могући број карактера). Ово може бити значајан проблем. На пример, неко жели наћи прву инстанцу садржаја у двоструким угластим заградама у тексту

Анотхер wхале еxплосион оццурред он [[-{January}- 26]], [[2004]], in [[-{Tainan City}-]], [[-{Taiwan}-]].

би најизгледније користио следећи узорак (\[\[.*\]\]), који изгледа исправан (уочимо да је угластој загради претходи бацксласх те ће на тај начин бити интерпретирана као карактер литерал). Међутим, овај ће узорак у ствари вратити [[-{January}- 26]], [[2004]], in [[-{Tainan City}-]], [[-{Taiwan}-]] уместо очекиваног [[-{January}- 26]]. Ово се догађа зато што ће узорак вратити све између прве двије углате заграде од [[-{January}- 26]] и посљедње двије углате заграде од [[-{Taiwan}-]].

Постоје два начина избегавања овог проблема. Први, уместо да се специфицира шта се спарује, специфицира се што се не спарује - у овом се случају ] не спарује, па ће узорак бити (\[\[[^\]]*\]\]). Међутим, овај узорак неће уопште спарити на овој ниски:

а б ц [[д е]] ф г]]

Друго, модерни алати за регуларне изразе дозвољавају квантификатору да буде специфициран као непохлепан, стављањем знака упитника испред квантификатора: (\[\[.*?\]\]).

Модерни (проширени) ПОСИX регуларни изрази[уреди]

Модернији "проширени" регуларни изрази могу често бити кориштени у модерним помоћним програмима на јуниксу користећи команднолинијску заставицу "-Е".

Проширени ПОСИX регуларни изрази су слични у синтакси традиционалним регуларним изразима на јуниксу, изузев неких измена. Следећи метакарактери су додати:

+ Спари последњи "блок" једанпут или више пута - "ба+" спарује ба, баа, бааа и тако даље
? Спари последњи "блок" нула или једном - "ба?" спарује б или ба
| Оператор избора (или уније скупова): спари или израз пре или израз после оператора - "абц|деф" спарује абц или деф.

Такође, бацксласх карактери су одбачени: \{...\} постаје {...} и \(...\) постаје (...). Примери:

"[хц]+ат" спарује хат, цат, ххат, цхат, хцат, цццхат итд.
"[хц]?ат" спарује хат, цат и ат
"([цЦ]ат)|([дД]ог)" спарује цат, Цат, дог и Дог

Будући да су карактери '(', ')', '[', ']', '.', '*', '?', '+', '^' и '$' кориштени као истакнути карактери посебне намене, морају бити "обележени" уколико их желимо користити као карактер литерале. То се обавља тако што се испред њих поставља карактер '\' који такође мора бити "обележен" уколико желимо да га схватимо као литерал. Примери:

"а\.(\(|\))" спарује ниску а.) или а.(

Перл-компатибилни регуларни изрази (ПЦРЕ)[уреди]

Перл-компатибилни регуларни изрази (енгл. Перл-цомпатибле регулар еxпрессионс) је имплементација регуларних израза у програмском језику [[Перл]]. Имају богатију и предвидљивију синтаксу чак и од проширених ПОСИX регеxа. Пример њихове предвидљивости је чињеница да \ увијек цитира (енгл. qуоте) неалфанумерички карактер. Пример нечега што је могуће специфицирати у Перл-у али не и у ПОСИX-у је одабир дела спаривања за који се жели да буде похлепан или не. На пример, у узорку /а.*б/, подузорак .* ће спарити колико год може, док ће узорак /а.*?б/, .*? спарити што је могуће мање. Тако ће у случају ниске "а бад даб" први узорак спарити целу ниску, док ће други спарити само "а б".

Због ових разлога, многи други помоћни програми и апликације су пригрлили синтаксу која јако слична Перл-овој - на пример Јава, Рубy, Пyтхон, ПХП, еxим, ББЕдит па чак и Мицрософт-ов .НЕТ фрамеwорк сви користе синтаксу регуларних израза сличну Перл-овој. Нису све "Перл-компатибилне" имплементације регуларних израза идентичне, и многе имплементирају само подскуп Перл-ових особина.

Узорци за нерегуларне језике[уреди]

Многи узорци пружају експресивну моћ која надалеко надилази ону регуларних језика. На пример, способност груписања подизраза заградама и њихово дохватање у истом изразу значи да узорак може спарити ниску понављајућих речи попут папа или WикиWики који се зову "квадрати" (енгл. сqуарес) у теорији формалних језика. Узорак за овакве ниске је само "(.*)\1". Међутим, језик квадрата није регуларан, па чак ни контекстно-слободан. Спаривање узорака са неограниченим бројем референци уназад, као што пружају бројни модерни алати, је НП-тешко.

С друге стране, многи алати, библиотеке и мотори који пружају такве конструкције свеједно користе назив регуларни израз за своје узорке. Ово је довело до номенклатуре у којој назив "регуларни израз" има различита значења у теорији формалних језика и у спаривању узорака. Предложено је кориштење назива регеx или једноставно узорак у последњем контексту. Ларрy Wалл (аутор Перл-а) пише у Апокалипси 5:

"'[Р]егуларни изрази' […] се само маргинално односи на праве регуларне изразе. Свеједно, назив је растао са способностима наших мотора за спаривање узорака, те се стога нећу овде покушати борити око лингвистичке неопходности. Међутим, уопштено ћу користити назив "регеxес" (или "регеxен" кад сам у англосаксонском расположењу)."

Имплементације и времена извршавања[уреди]

Постоје барем два различита алгоритма одлучивања спарује ли (и како) регуларни израз дату ниску.

Најстарији и најбржи се поуздаје на резултат произишао из теорије формалних језика који дозвољава конверзију било којег недетерминистичког коначног аутомата (НКА) у исти детерминистички коначни аутомат (ДКА). Алгоритам обавља или симулира конверзију и потом покреће процес прихватања улазне ниске над ДКА, један по један знак. Овај последњи корак захтева линеарно време у зависно од дужине улазне ниске. Прецизније, улазна ниске величине н се може тестирати регуларним изразом величине м у времену О(н+2м) или О(нм), зависно од детаља програмске имплементације. Овај алгоритам се често назива ДКА алгоритам. Брз је, али се може користити само за спаривање, не и за дохватање груписаних подизраза. Постоји варијанта која може дохватити и груписане подизразе, али њено време извођења успорава све до О(н2м).

Други алгоритам је спаривање узорка и улазне ниске кориштењем претраживања уназад. (Овај се алгоритам понекад зове НКА, али ова терминологија често збуњује). Време извођења овог алгоритма може бити експоненцијално, што једноставне имплементације демонстрирају када спарују изразе попут "(а|аа)*б" који садрже и алтернацију и неограничену квантификацију, те тако присиљавају алгоритам да узме у обзир експоненцијалан број подизраза. Сложеније имплемантације идентификују и убрзавају разне уобичајене случајеве.

Иако имплементације методом претраживања уназад могу дати само експоненцијалну гаранцију у најгорем случају, дозвољавају много већу флексибилност и пружају изражајнију моћ. На пример, свака имплементација која дозвољава употребу референци уназад, или пак остварује разна побољшања која је Перл увео, мора бити имплементирана преко претраживања унатад.

Неке имплементације покушавају пружити најбоље од оба алгоритма тако што прво покрећу ДКА спаривање да виде спарује ли уопчте ниска регуларни израз, и само у том случају обављају потенцијално спорије спаривање претраживањем уназад.

Регуларни изрази и Уницоде[уреди]

Регуларни су изрази изворно кориштени са АСЦИИ карактерима. Многи мотори регуларних израза данас могу барати и са Уницоде симболима. У већини случајева је свеједно о којем се скупу карактера ради, али одређени проблеми се појављују проширивањем регуларних израза у Уницоде.

Један од проблема је који је Уницоде формат подржан. Сви команднолинијски мотори регуларних израза подржавају УТФ-8, али то варира код библиотека регуларних израза. Неке очекивају УТФ-8, док друге очекивају друга Уницоде енкодирања (УТФ-16, застарели УЦС-2 или УТФ-32).

Други проблем је да ли је пуни Уницоде опсег подржан. Многи мотори регуларних израза подржавају само основни вишејезични фармат, тј. карактере који се могу енкодирати само у 16 битова. Само неколико тренутно присутних мотора могу баратати пуним 21-битним Уницоде опсегом.

Трећи проблем је варијација у начину како АСЦИИ оријентисане конструкције могу бити проширени у Уницоде. На пример, у АСЦИИ базираним имплементацијама, карактерни опсези облика [x-y] су ваљани кад год су x и y кодне тачке (енгл. цодепоинт) у опсегу [0x00,0x7Ф] при чему је цодепоинт(x) <= цодепоинт(y). Природно проширење таквих опсега карактера би једноставно променило захтев да крајње тачке леже у опсегу [0x00,0x7Ф] у захтев да леже у опсегу [0,0x10ФФФФ]. Међутим, у пракси то није толико чест случај. Неке имплементације, попут онога помоћног алата [[гаwк]], не дозвољавају да опсези карактера пређу границе Уницоде блокова. Опсег попут [0x61,0x7Ф] је исправан пошто обе крајње тачке леже у основном латиничном блоку, као што је исправан и [0x0530,0x0560] пошто обе крајње тачке леже у арменском блоку, али опсег попут [0x0061,0x0532] је неисправан будући да укључује вишеструке Уницоде блокове. Други мотори, попут онога у уређивачу Вим, дозвољавају прелаз између блокова али ограничавају број карактера у опсегу на 128.

Такође је подручје у којем постоје варијације у интерпретацији оно које се тиче заставица контроле разликовања великих и малих слова. Неке такве заставице делују само на АСЦИИ карактере. Друге заставице делују на све карактере. Неки мотори имају различите заставице, једну за АСЦИИ другу за Уницоде. Такође варира одређивање који карактери припадају ПОСИX разредима.

Други одговор на Уницоде је било увођење разреда карактера за Уницоде блокове и уопштена својства Уницоде карактера. У Перл-у и у Јава библиотеци јава.утил.регеx, разреди облика \п{ИнX} спарују карактере у блоку X и \П{ИнX} спарује комплемент. На пример, \п{Армениан} спарује било који карактер у арменском блоку. Слично, \п{X} спарује било који карактер са општим својством карактера X и \П{X} комплемент. На пример, \п{Лу} спарује сва велика слова.

Употреба регуларних израза[уреди]

Регуларни изрази су изразито корисни у програмима комплетирања кода и бојења синтаксе у интегрисаним развојним окружењима. На пример

"(public|private|protected)\s*(\w+)\s+(\w+)\s*\("

би спарио функције у многим програмским језицима.

Референце[уреди]

  1. ^ [[Ларрy Wалл и Перл 5 развојни тим|Wалл, Ларрy]] (2006). „перлре: Перл регулар еxпрессионс”.  Проверите вредност параметра |аутхор-линк1= (помоћ)
  2. ^ Wалл, Ларрy (4. 6. 2002). „Апоцалyпсе 5: Паттерн Матцхинг”. 

Литература[уреди]

Спољашње везе[уреди]

Чланци[уреди]