I databehandling er et regulært udtryk eller et regulært udtryk eller et normalt udtryk eller mønster en tegnstreng , der ifølge en præcis syntaks beskriver et sæt mulige tegnstrenge. Regulære udtryk kaldes også regex (et portmanteau- ord dannet af engelsk regulært udtryk ). Regulære udtryk kommer fra matematiske teorier om formelle sprog fra 1940'erne. Deres evne til kortfattet at beskrive regelmæssige sæt forklarer, hvorfor de blev fundet på flere videnskabelige områder i efterkrigsårene og retfærdiggør deres vedtagelse inden for datalogi . Regulære udtryk bruges i dag til at programmere software med funktioner til læsning, kontrol, ændring og analyse af tekster såvel som til manipulation af formelle sprog såsom computersprog .
Disse regulære udtryk har den kvalitet, at de kan beskrives ved formler eller mønstre, (på engelske mønstre ) meget enklere end de andre midler.
I 1940'erne , Warren McCulloch og Walter Pitts beskrevet nervesystemet ved at modellere neuroner ved simpel automater. I 1956 beskrev logikeren Stephen Cole Kleene disse modeller med ordinære sæt og automater . Han anses for at være opfinderen af regulære udtryk. I 1959 tilbød Michael O. Rabin og Dana Scott den første matematiske og strenge behandling af disse begreber, hvilket gav dem Turing-prisen i 1976.
I denne sammenhæng svarer regulære udtryk til type 3-grammatik (se Formel grammatik ) i Chomsky-hierarkiet ; de kan derfor bruges til at beskrive et sprogs morfologi .
Ken Thompson implementerede Kleenes notation i qed- editoren , derefter ed- editoren i Unix og endelig i grep . Siden da er regelmæssige udtryk blevet brugt i vid udstrækning i værktøjer som lex samt programmeringssprog født under Unix som expr , awk , Perl , Tcl , Python osv.
Efterladt den teoretiske ramme har regulære udtryk erhvervet funktionaliteter, der muliggør beskrivelse af ikke-rationelle sprog. Der er således sket et semantisk skifte: begrebet regelmæssigt udtryk har ikke den samme betydning i anvendt computing og i teorien om formelle sprog.
Almindelig udtryk | Beskrevne ord | Ord ikke beskrevet |
---|---|---|
opdaget | "Opdaget" | "Opdaget", "opdaget", "opdaget", "" |
ex- (a? e | æ | é) quo | "Ex-equo", "ex-equo", "ex-aequo" og "ex-æquo" |
"Ex-quo", "ex-aiquo", "ex-aeko", "ex-æéquo" |
^ Afsnit. + | "Afsnit 1", "Afsnit 22", "Afsnit A", ... |
"Se afsnit 1", " sektion " |
6,66 $ * | "6.6", "6.666", "6.6666", ... |
"6,66667", |
[1234567890] + (, [1234567890] +)? | "2", "42", "0.618", "49.3", ... |
"3", ", 75", "" |
Oprindeligt oprettet til at beskrive formelle sprog, bruges regelmæssige udtryk til analyse og manipulation af computersprog ; kompilatorer og tolke er således baseret på disse.
Brugt som tekstsøgningsværktøjerne i et dokument, beskriver et regulært udtryk strenge af tegn, der har fælles egenskaber for at finde dem i en tekstblok for at anvende en automatiseret behandling, såsom en tilføjelse, deres erstatning, ændring eller sletning.
Mange teksteditorer og de fleste indbyggede udviklingsmiljøer understøtter regelmæssige udtryk. Et stort antal Unix- værktøjer ved, hvordan man bruger dem indbygget. De mest kendte er GNU grep eller GNU sed, som ligesom teksteditorer bruger disse udtryk til automatisk at gennemse et dokument på jagt efter tekststykker, der er kompatible med søgemønsteret, og muligvis for at tilføje, erstatte eller slette.
De kommandolinjegrænseflader (eller skaller ) bruger et beslægtet, men særskilt system og mindre udtryksfulde kaldes glob (en) eller globbing.
Regulære udtryk bruges ofte i systemadministration , softwareudvikling og naturlige sprogbehandlingsaktiviteter . De så et nyt anvendelsesområde med udviklingen af Internettet og formidlingen af ondsindet kode eller spam- beskeder . Af filtre og robotter, der bruger disse udtryk, bruges til at opdage potentielt skadelige genstande.
I formel sprogteori er et regulært udtryk et udtryk, der repræsenterer et rationelt sprog . I denne sammenhæng har regulære udtryk en mere begrænset udtryksstyrke: denne forestilling har en bredere betydning i anvendt computing end i formel sprogteori.
Et regulært udtryk er en række typografiske tegn (som mere enkelt kaldes "mønster" - " mønster " på engelsk), der beskriver et sæt tegnstrenge . For eksempel kan ordsættet "bundet, bundet, bundet og bundet" kondenseres til et enkelt mønster "ex- (a? E | æ | é) quo". De grundlæggende mekanismer til dannelse af sådanne udtryk er baseret på specielle tegn på substitution, gruppering og kvantisering.
En lodret bjælke adskiller normalt to alternative udtryk: "equo | aequo" betegner enten equo eller aequo. Det er også muligt at bruge parenteser til at definere feltet og prioriteten for detektionen, "(ae | e) quo", der betegner det samme sæt som "aequo | equo" og at kvantificere de grupper, der er til stede i mønsteret ved at tilføje kvantiseringstegn til retten til disse grupperinger.
De mest almindelige kvantificeringsmidler er:
Symboler med særlig semantik kan kaldes "operatorer", "metategn" eller "specialtegn". Tegn, der kun repræsenterer sig selv, kaldes "bogstaver".
Regulære udtryk kan kombineres, for eksempel ved sammenkædning , for at producere mere komplekse regulære udtryk.
Når en streng af tegn matcher beskrivelsen fra det regulære udtryk, siger vi, at der er en "match" mellem strengen og mønsteret, eller at mønsteret "matcher" strengen. Denne korrespondance kan vedrøre hele eller en del af tegnstrengen. For eksempel i sætningen ”De to hold sluttede uafgjort og hilste på hinanden. ", Understrengen" ex-æquo "matches med mønsteret" ex- (a? E | æ | é) quo ".
Som standard regulære udtryk er tilfældet følsomme . Når det er muligt, prøver de at matche det største underlag svarende til mønsteret: de siges at være "grådige". Aa+Genkender f.eks. Hele strengen "Aaaaaaa" snarere end en del "Aaa" (gluttony), men den genkender ikke strengen "aaaA" (store og små bogstaver).
Operatører | Beskrivelse | Eksempler | ||
---|---|---|---|---|
Almindelig udtryk | Beskrevne kæder | Kanaler ikke beskrevet | ||
ekspr 1 ekspr 2 | Sammenkædningsoperator af to udtryk (implicit). | ab | "Ab" | "A", "b", tom streng |
. | Én karakter og én | . | "A", "b" osv. | tom streng, "ab" |
ekspr ? | Denne kvantifikator svarer til det, der går forud for det, præsenterer nul eller en gang . Hvis der findes flere matches i en tekst, finder den først dem, der er placeret øverst i teksten, og returnerer derefter den størst mulige længde fra den oprindelige position. | på? | tom streng, "a" | "Aa", "b" |
udtryk + | Denne kvantifier svarer til det, der går forud for det, gentaget en eller flere gange . Hvis der findes flere matches i en tekst, finder den først dem, der er placeret øverst i teksten, og returnerer derefter den størst mulige længde fra den oprindelige position. | a + | "A", "aa", "aaaaa" osv. | tom streng, "b", "aaab" |
udtryk * | Denne kvantifier svarer til det, der går forud for det, gentaget nul eller flere gange . Hvis der findes flere matches i en tekst, finder den først dem, der er placeret øverst i teksten, og returnerer derefter den størst mulige længde fra den oprindelige position. | på* | tom streng, "a", "aaa" osv. | "B", "aaab" |
udtryk 1 | udtryk 2 | Det er operatøren, der vælger mellem flere alternativer, det vil sige den sammensatte union. Det kan kombineres så mange gange som nødvendigt for hvert af de mulige alternativer. Det matcher et af de udtryk, der er placeret før eller efter operatøren . Disse udtryk kan valgfrit være tomme, og så (x |) svarer til x?. | a | b | "A", "b" | tom streng, "ab", "c" |
[ liste ] | Et af tegnene i firkantede parenteser ("karakterklasse") | [a e i o u] | "A", "e", "i" osv. | tom streng, "b", "ae" |
[^ liste ] | Et tegn, der ikke er i firkantede parenteser ("karakterklasse") | [^ aeiou] | "B" osv. | tom streng, "a", "bc" |
( udtryk ) | Gruppering af udtrykket i parentes | (opdaget) | "Opdaget" | "Opdaget", "opdaget", "opdaget" |
udtryk { n } | Præcis n forekomster af udtrykket forud for selerne | en {3} | "Aaa" | "Aa", "aaaa" |
udtryk { n , m } | Mellem n og m forekomster af udtrykket forud for selerne | a {2.4} | "Aaa", "aaa", "aaaa" | "A", "aaaaa" |
udtryk { n ,} | Mindst n forekomster af udtrykket, der går forud for selerne | en {3,} | "Aaa", "aaaa", "aaaaa" osv. | "Aa" |
^ | Dette prædikat svarer ikke til noget tegn, men løser en nødvendig betingelse, der gør det muligt at finde en aftale om, hvad der følger det ved at indikere, at det skal være i begyndelsen af en linje (således være i begyndelsen af inputteksten eller efter et linjeskift) . Det kan ikke betragtes som sådan i begyndelsen af det regulære udtryk, andetsteds betragtes det bogstaveligt. Det gælder som en betingelse for resten af det regulære udtryk (og vedrører derfor alle de repræsenterede alternativer). | ^ a finder "a" i begyndelsen af linjen, men ikke i "ba". | ||
$ | Dette prædikat matcher ikke noget tegn, men løser en nødvendig betingelse, der gør det muligt at finde en aftale om, hvad der går forud for det ved at angive, at det skal være i slutningen af en linje (således være i slutningen af inputteksten eller lige før et linjeskift) . Det kan ikke betragtes som sådan i slutningen af det regulære udtryk, andetsteds betragtes det bogstaveligt. Det gælder som en betingelse for resten af det regulære udtryk (og vedrører derfor alle de repræsenterede alternativer). | a $ finder "a" i slutningen af linjen, men ikke i "ab". |
I datalogi kaldes et værktøj til manipulation af regulære udtryk en motor med regulært udtryk eller regulær udtryk . Der er standarder for at sikre konsistens i brugen af disse værktøjer.
POSIX- standarden tilbyder tre sæt standarder:
Regulære udtryk i perl er også en de facto standard på grund af deres udtryksfulde rigdom og magt. Mens de følger deres egen udvikling, er de for eksempel oprindelsen af PCRE- biblioteket . ECMAScript foreslår også i dokumentet Standard ECMA-262 en standard brugt for eksempel af JavaScript .
Notationer eller deres semantik kan variere lidt fra en reguleringsudtryksmotor til en anden. De kan kun delvist eller delvist overholde disse standarder eller tilbyde deres egne funktioner, såsom GNU eller .NET Framework . Specifikationerne for hver diskuteres senere i denne artikel.
En karakterklasse er et sæt tegn. Det kan defineres på forskellige måder:
Foreninger af karakterklasser kan oprettes: [0-9ab]betegner det sæt, der består af tegnene "0" til "9" og bogstaverne "a" og "b". Nogle biblioteker giver dig også mulighed for at krydse karakterklasser.
Mellem de firkantede parenteser fortolkes metategnene bogstaveligt: [.?*]betegner det sæt, der består af tegnene ". ","? "Og" * ".
De mest anvendte karakterklasser leveres normalt med motoren til regulært udtryk. En oversigt over disse klasser foretages i nedenstående tabel.
POSIX-biblioteket definerer indledningsvis klasser for ASCII og derefter i forlængelse for andre former for tegnkodning afhængigt af lokalitet .
I Unicode og sprog som perl defineres sæt af tegn gennem begrebet karakteregenskaber. Dette gør det muligt at udpege et sæt tegn i henhold til deres kategori (eksempler: bogstav, åbningstegn, afslutningstegn, skilletegn, kontroltegn) i henhold til skriveretningen (f.eks. Fra venstre mod højre eller fra højre mod venstre), afhængigt af alfabetet (eksempler: latin, kyrillisk, græsk, Hiragana); i henhold til blokallokeringen eller endda i henhold til de samme principper som POSIX-tegnklasserne (læs afsnittet Regular expressions og Unicode om dette emne ).
POSIX | Ikke standard | perl, Python | Vim | Java | Unicode | ASCII | Beskrivelse |
---|---|---|---|---|---|---|---|
\p{ASCII} | [\x00-\x7F] | ASCII- tegn | |||||
[:alnum:] | \p{Alnum} | A-Za-z0-9 | Alfanumeriske tegn | ||||
[:word:] | \w | \w | \w | A-Za-z0-9_ | Alfanumeriske tegn og "_" | ||
\W | \W | \W | ^A-Za-z0-9_ | Tegn, der ikke udgør ord | |||
[:alpha:] | \a | \p{Alpha} | \p{L} eller \p{Letter} | A-Za-z | Alfabetiske tegn | ||
[:blank:] | \s | \p{Blank} | \t | Mellemrum og fane | |||
\b | \< \> | \b | (?<=\W)(?=\w)|(?<=\w)(?=\W) | Begyndelses- og slutposition af ord | |||
\B | \B | (?<=\W)(?=\W)|(?<=\w)(?=\w) | Positioner, der ikke svarer til begyndelsen eller slutningen af et ord | ||||
[:cntrl:] | \p{Cntrl} | \p{Cc} eller \p{Control} | \x00-\x1F\x7F | Kontrol tegn | |||
[:digit:] | \d | \d | \p{Digit} eller \d | \p{Nd} eller \p{Decimal_Digit_Number} | 0-9 | Decimal cifre | |
\D | \D | \D | \P{Nd} eller \P{Decimal_Digit_Number} | ^0-9 | Noget andet end et decimal | ||
[:graph:] | \p{Graph} | \x21-\x7E | Synlige tegn | ||||
[:lower:] | \l | \p{Lower} | \p{Ll} eller \p{Lowercase_Letter} | a-z | Små bogstaver | ||
[:print:] | \p | \p{Print} | \x20-\x7E | Udskrivbare tegn | |||
[:punct:] | \p{Punct} | \p{P} eller \p{Punctuation} | ][!"#$%&'()*+,./:;<=>?@\^_`{|}~- | Tegnsætningstegn | |||
[:space:] | \s | \_s | \p{Space} eller \s | \p{Z} eller \p{Separator} | \t\r\n\v\f | Rumtegn | |
\S | \S | \S | \P{Z} eller \P{Separator} | ^ \t\r\n\v\f | Noget andet end et rumkarakter | ||
[:upper:] | \u | \p{Upper} | \p{Lu} eller \p{Uppercase_Letter} | A-Z | Store bogstaver | ||
[:xdigit:] | \x | \p{XDigit} | A-Fa-f0-9 | Hexadecimale cifre | |||
\A | Start af tegnstreng | ||||||
\Z | Slut på tegnstreng |
F.eks. Matcher POSIX-standarden [[:upper:]ab]et tegn blandt det sæt, der er dannet af store og små bogstaver "a" og "b". I ASCII-standarden ville dette regulære udtryk blive skrevet [A-Zab].
Begrebet ækvivalensklasse bør ikke forveksles med begrebet karakterklasse.
For eksempel grupperer klassen [= e =] i FR-lokalet alle bogstaverne {e, é, è, ë, ê}.
Dette betyder, at når de er sorteret, vises bogstaverne {e, é, è, ë, ê} i samme tegnsæt efter d og før f .
De fleste standarder og regulære ekspressionsmotorer tilbyder avancerede funktioner. Især:
De anvendte notationer er meget variable. Dette kapitel samler på den ene side de notationer, der er specifikke for forskellige implementeringer, og på den anden side standardiseringsfirmaet.
POSIX- standarden har forsøgt at afhjælpe spredningen af syntaks og funktionalitet ved at tilvejebringe en standard for konfigurerbare regulære udtryk. Du kan få et overblik ved at læse vejledningen til regexmange Unix- dialekter inklusive GNU / Linux . Selv denne standard inkluderer dog ikke al den funktionalitet, der er føjet til Perl-regulære udtryk.
Endelig tilføjer POSIX support til platforme, der bruger et ikke-ASCII-baseret tegnsæt, især EBCDIC , og delvis lokal understøttelse for nogle metategn.
Grundlæggende regulære udtrykHjælpeprogrammer i Unix- verdenen som sed , GNU grep , ed eller vi bruger BRE-standarden (“ Basic Regular Expression ”) som standard . I den er seler, parenteser, symbolet "? "Og" + "symbolet er ikke metategn: de repræsenterer kun sig selv. For at tage deres semantik fra metategn, skal de undslippes med symbolet "\".
Eksempel: det regulære udtryk matcher (ab.)+"(abc) +" men ikke "abcabd", som det \(ab.\)\+passer til.
Udvidede regulære udtrykPOSIX Extended Regular Expression (ERE ) understøttes ofte i hjælpeprogrammer til Unix- og GNU / Linux-distributioner ved at medtage -E- flag i kommandolinjeanfordring af disse hjælpeprogrammer. I modsætning til almindelige regulære udtryk genkender de tegn, der tidligere er set som metategn. De skal derfor undslippes for at blive fortolket bogstaveligt.
De fleste af eksemplerne her er POSIX-udvidede regulære udtryk.
Escape sekvenserSom de tegn (, ), [, ], ., *, ?, +, ^, |, $, -og \anvendes som specielle symboler, skal de henvises til i et escape-sekvens , hvis de bogstaveligt talt er betegne den tilsvarende karakter. Dette gøres ved at give dem et tilbageslag \.
Lignende udvidelser bruges i emacs- editoren , som bruger et andet sæt kommandoer fra POSIX-standarden; men bruger de samme regulære udtryk med en udvidet notation. De udvidede regulære udtryk understøttes nu også i vim , den forbedrede version af vi .
Udvidet operatør (ikke POSIX) | Beskrivelse | Eksempel |
---|---|---|
\{m,n\} | I udvidet notation opretter dette en brugerdefineret afgrænset kvantificering, der giver m mulighed for nøjagtigt at matche n forekomster af ovenstående, hvor m og n er to heltal, således at m < n . En af de to parametre kan udelades: hvis den første parameter m udelades, er den som standard 0; hvis den anden parameter n udelades, men kommaet er til stede, betragtes det som uendeligt; hvis den anden parameter n udelades såvel som det adskillende komma, tager den standardværdien lig med den første parameter m . | Se eksempler nedenfor. |
\( \) | I udvidet notation bruges grupperingsparenteser (i en escape-sekvens) til at afgrænse et sæt alternativer eller en hvilken som helst regelmæssig underekspression (undtagen start- og slutning af linjebetingelser) til at anvende en kvantificering. Derudover afgrænser disse parenteser en nummereret indfangningsgruppe, som kan bruges til substitutioner (vi henviser derefter til de indfangede grupper i substitutionskæden med hvor n er indfangningsgruppenummeret mellem 1 og 9, hvor hele kæden findes repræsenteret af ). $n$& | Se eksempler nedenfor. |
Derudover tilføjes mange andre flugtsekvenser for at betegne foruddefinerede karakterklasser. De er specifikke for hvert værktøj eller varierer undertiden alt efter version eller platform (men de har været stabile i lang tid i emacs, som var en forløber for disse udvidelser, som andre forfattere delvist har implementeret på en begrænset måde eller anderledes).
Python bruger regulære udtryk baseret på POSIX-regulære udtryk med nogle udvidelser eller forskelle.
De POSIX-kompatible emner er som følger:
Sekvensen \bangiver backspace-tegnet ( 0x08med ASCII-kompatibel kodning), når det bruges i en tegnklasse, og ellers grænsen for et ord.
Det BSD Operativsystemet bruger regex bibliotek skrevet af Henry Spencer . Dette bibliotek er kompatibelt med POSIX 1003.2-standarden og bruges også af MySQL (med REGEXP- og IKKE REGEXP-operatører) og PostgreSQL (med “~” -operatøren og dens varianter).
Tcl- sprogets regulære udtryksmotor kommer fra udviklingen af Henry Spencer efter BSD-bibliotekets. Regulære udtryk kaldes Advanced Regular Expressions (eller ARE) og adskiller sig lidt fra de udvidede regulære udtryk i POSIX. Grundlæggende og udvidede regulære udtryk understøttes også.
I modsætning til andre motorer fungerer denne på en PLC-basis, hvilket gør det mindre effektivt, når der er behov for optagelser eller backtracking , men ellers er det mere effektivt.
Perl tilbyder et særligt rigt sæt udvidelser. Dette programmeringssprog er meget vellykket på grund af tilstedeværelsen af operatører med regulære udtryk, der er inkluderet i selve sproget. De udvidelser, den tilbyder, er også tilgængelige for andre programmer under navnet lib PCRE ( Perl-Compatible Regular Expressions , bogstaveligt talt bibliotek med regulære udtryk, der er kompatible med Perl ). Dette bibliotek blev oprindeligt skrevet til Exim- mailserveren , men overtages nu af andre projekter som Python , Apache , Postfix , KDE , Analog , PHP og Ferite .
Perl 6- specifikationerne regulerer og udvider mekanismen til regulært ekspressionssystem. Desuden er det bedre integreret i sproget end i Perl 5. Kontrollen med return on track er meget fin der. Perl 6s regex-system er kraftigt nok til at skrive parsere uden at bruge parser- plugins. Regulære udtryk er en form for underrutiner, og grammatikker er en form for klasse . Mekanismen implementeres i Parrot- samler af PGE- modulet i Parrot-implementeringen af Perl 6 og i Haskell i Pugs- implementeringen . Disse implementeringer er et vigtigt skridt i opbygningen af en komplet Perl 6- kompilator . Nogle af funktionerne i Perl 6 regexp, såsom navngivne optagelser, er indbygget siden Perl 5.10.
PHP understøtter to former for notationer: POSIX- syntaksen (POSIX 1003.2) og den, meget rigere og mere effektiv, af PCRE- biblioteket (Perl Compatible Regular Expression).
En af de fejl, der kritiseres i PHP, er relateret til dens begrænsede understøttelse af tegnstrenge, selvom den hovedsagelig bruges til at behandle tekst, da tekst kun kan repræsenteres i et sæt tegn kodet på 8 bit uden at være i stand til klart at angive, hvilken kodning anvendes. I praksis er det derfor nødvendigt at tilføje til PHP-supportbiblioteker til kodning og afkodning af tekster, hvis kun for at repræsentere dem i UTF-8. Selv i UTF-8 opstår problemet imidlertid straks med semantikken for regulære udtryk, da tegnene derefter har en kodning med variabel længde, hvilket kræver at gøre regulære udtryk mere komplekse. Valgfri PHP-udvidelser er derfor udviklet til at skabe en ny datatype til tekst for at gøre det lettere at behandle den (og til sidst være kompatibel med Perl6, som ligesom Haskell indfødt har fuld Unicode-understøttelse).
ICU definerer et bærbart bibliotek til international tekstbehandling. Dette er først udviklet på C-sprog (version med navnet ICU4C) eller til Java-platformen (version med navnet ICU4J). Porte (eller tilpasninger) er også tilgængelige på mange andre sprog ved hjælp af biblioteket udviklet til C (eller C ++ ) sprog .
De regulære udtryk, der kan bruges i ICU, har karakteristikaene for regulære udtryk i Perl, men supplerer dem for at give dem fuld støtte til Unicode-tegnsættet (se næste afsnit for spørgsmål vedrørende den standardisering, der stadig er i gang). De afklarer også deres betydning ved at gøre regelmæssige udtryk uafhængige af det kodede tegnsæt, der bruges i dokumenter, da Unicode-tegnsættet bruges som den interne drejekodning.
Dette skyldes, at regulære udtryk i Perl (eller PCRE) ikke er bærbare til behandling af dokumenter ved hjælp af forskellige kodede tegnsæt, og de understøtter heller ikke korrekt tegnsæt med multibyte (variabel længde) såsom ISO 2022 , Shift-JIS eller UTF-8 ) , eller kodet på en eller flere binære enheder på mere end 8 bit (for eksempel UTF-16 ), da den faktiske kodning af disse sæt som sekvenser af bytes afhænger af platformen. -form, der anvendes til behandling (rækkefølge for lagring af bytes i en ord på mere end 8 bit).
ICU løser dette ved at vedtage behandling, der internt bruger et enkelt 32-bit sæt og understøtter det fulde universelle tegnsæt (UCS), som defineret i ISO / IEC 10646 og semantisk specificeret i Unicode- standarden. (Som tilføjer standarden understøttelse af informative eller normative egenskaber på tegn og anbefalinger til automatisk tekstbehandling, hvor nogle af disse anbefalinger er valgfri eller informative, andre er blevet standard og integreret i selve Unicode-standarden, andre har endelig opnået status som international standard ved ISO eller national standard i visse lande).
ICU understøtter følgende udvidelser direkte i regulære udtryk eller i det regulære udtryk for en karakterklasse (mellem […]):
ICU-regulære udtryk er i øjeblikket blandt de mest kraftfulde og udtryksfulde inden for flersproget dokumentbehandling. De er stort set grundlaget for (stadig igangværende) standardisering af Unicode-regulære udtryk (se nedenfor), og et undersæt understøttes indbygget i standard Java- sprogbiblioteket (som internt bruger et bærbart tegnsæt til variabel kodning, baseret på UTF-16 med udvidelser, og hvis kodningsenheder er 16 bit).
ICU er et bibliotek, der stadig er under udvikling. I princippet bør den vedtage alle de udvidelser, der er annonceret i Perl (inklusive navngivne optagelser) for at sikre interoperabilitet med Perl 5, Perl 6 og PCRE og det voksende antal andre sprog, der bruger denne. Udvidet syntaks, og forfatterne af ICU og Perl arbejder sammen om at definere en fælles notation. Imidlertid vedtager ICU primært de udvidelser, der er vedtaget i de regulære udtryk, der er beskrevet i Unicode-standarden, da ICU fungerer som hovedreference i dette Unicode-standardbilag.
Der er dog endnu ingen standard eller teknisk standard til at behandle nogle vigtige aspekter af regulære udtryk i en flersproget sammenhæng, herunder:
For at afklare disse sidstnævnte manglende aspekter, bør yderligere metategn kunne bruges til at kontrollere eller filtrere de fundne forekomster, ellers en standardiseret ordre pålagt listen over forekomster, der returneres. Ansøgningsforfattere skal derfor være opmærksomme på disse punkter og sørge for at læse alle fundne begivenheder og ikke kun de første for at kunne bestemme, hvilken af begivenhederne, der er bedst egnet til en given operation.
Regulære udtryk blev oprindeligt brugt med ASCII- tegn . Mange regulære ekspressionsmotorer kan nu håndtere Unicode . På mange måder gør det anvendte kodede tegnsæt ingen forskel, men der opstår nogle problemer med at udvide regelmæssige udtryk til Unicode.
Et spørgsmål er hvilket internt Unicode-repræsentationsformat der understøttes. Alle kommandolinjemotorer med regulært udtryk forventer UTF-8 , men for biblioteker forventer nogle også UTF-8, men andre forventer kun et UCS-2-kodet spil (eller endda dets UTF-16- udvidelse, som også begrænser gyldige sekvenser) eller på UCS- Kun 4 (se dens standardiserede UTF-32- begrænsning ).
Et andet spørgsmål er, om hele værdiområdet for en version af Unicode understøttes. Mange motorer understøtter kun Basic Multilingual Plane , dvs. 16-bit kodbare tegn. Kun få motorer kan (fra 2006) håndtere 21-bit Unicode-værdiområderne.
Et tredje spørgsmål er, hvordan ASCII-konstruktioner udvides til Unicode.
I praksis er dette imidlertid ofte ikke tilfældet:
Et andet område, hvor der findes variationer, er fortolkningen af sagsfølsomhedsindikatorer.
Et andet svar på Unicode var introduktionen af karakterklasser til Unicode-blokke og generelle egenskaber for Unicode-tegn:
Bemærkninger:
Der er mindst tre familier af algoritmer, der bestemmer, om en streng matcher et regulært udtryk.
Den ældste tilgang, kaldet eksplicit, er afhængig af oversættelsen af det regulære udtryk til en deterministisk endelig automat (DFA). Konstruktionen af en sådan automat til et regulært udtryk for størrelse m har en kompleksitet i størrelse og i hukommelse i O (2 m ), men kan udføres på en streng af størrelse n på en tid O (n) .
En alternativ tilgang, kaldet implicit, består i at simulere en ikke-deterministisk endelig automat ved at opbygge hver AFD i farten og slippe af med den i næste trin. Denne tilgang undgår den eksponentielle kompleksitet af den tidligere tilgang, men udførelsestiden øges i O (mn) . Disse algoritmer er hurtige, men visse funktionaliteter som f.eks. Genskabelse af underlag og den ikke-grådige kvantisering er vanskelige at implementere.
Den tredje tilgang består i at sammenligne mønsteret med tegnstrengen ved adskillelse og evaluering (" backtracking "). Dens algoritmiske kompleksitet er i værste fald eksponentiel, for eksempel med mønstre som (a|aa)*b, men giver gode resultater i praksis. Det er mere fleksibelt og giver mulighed for større udtryksstyrke, for eksempel ved at forenkle genindfangelsen af underlag.
Nogle implementeringer forsøger at kombinere kvaliteterne ved forskellige tilgange, starte søgningen med en AFD og derefter bruge adskillelse og evaluering, når det er nødvendigt.