Az adatfeldolgozásban a reguláris kifejezés vagy a reguláris kifejezés, vagy a normál kifejezés vagy minta egy karakterlánc , amely pontos szintaxis szerint leírja a lehetséges karakterláncok halmazát . A reguláris kifejezéseket regexnek is nevezzük ( az angol reguláris kifejezésből képzett portmanteau szó ). A rendszeres kifejezések az 1940-es évek hivatalos nyelveinek matematikai elméleteiből származnak, és képesek a szabályos halmazokat tömören leírni, és megmagyarázzák, miért kerültek elő a háború utáni években több tudományos területen, és igazolják számítástechnikában való alkalmazásukat . A rendszeres kifejezéseket manapság olyan szoftverek programozására használják, amelyek szövegek olvasására, vezérlésére, módosítására és elemzésére szolgálnak, valamint a hivatalos nyelvek, például a számítógépes nyelvek manipulálásához .
Ezeknek a reguláris kifejezéseknek az a tulajdonságuk, hogy képletekkel vagy mintákkal írhatók le (angol nyelvű mintákban ), sokkal egyszerűbben, mint a többi eszköz.
Az 1940-es években , Warren McCulloch és Walter Pitts leírt az idegrendszer modellezésével neuronok egyszerű automaták. 1956-ban Stephen Cole Kleene logikus ekkor leírta ezeket a modelleket a rendszeres halmazok és az automaták szempontjából . A rendszeres kifejezések feltalálójának tartják. 1959-ben Michael O. Rabin és Dana Scott felajánlotta e fogalmak első matematikai és szigorú kezelését, amely 1976-ban elnyerte a Turing-díjat .
Ebben az összefüggésben a reguláris kifejezések megfelelnek a Chomsky-hierarchia 3. típusú nyelvtanainak (lásd: Formális nyelvtan ) ; ezért felhasználhatók egy nyelv morfológiájának leírására .
Ken Thompson implementálta Kleene jelölését a qed szerkesztõbe , majd az ed szerkesztõbe a Unix-ban, végül pedig grep-ben . Azóta a reguláris kifejezéseket széles körben használják olyan segédprogramokban, mint a lex, valamint a Unix alatt született programozási nyelvekben, mint például az expr , az awk , a Perl , a Tcl , a Python stb.
Az elméleti keretrendszert elhagyva a rendszeres kifejezések olyan funkciókat szereztek, amelyek lehetővé teszik a nem racionális nyelvek leírását. Jelentős elmozdulás következett be: a szabályos kifejezés fogalmának nincs azonos jelentése az alkalmazott számítástechnika és a formális nyelvek elméletében.
Reguláris kifejezés | Leírt szavak | Nem leírt szavak |
---|---|---|
észlelték | "Észlelt" | "Észlelt", "észlelt", "észlelt", "" |
ex- (a? e | æ | é) quo | „Ex-equo”, „ex-equo”, „ex-aequo” és „ex-æquo” |
"Ex-quo", "ex-aiquo", "ex-aeko", "ex-æéquo" |
^ Szakasz. + | „1. szakasz”, „22. szakasz”, „A szakasz”,… |
"Lásd 1. szakasz", " Szakasz " |
6,66 USD * | "6.6", "6.666", "6.6666", ... |
"6.66667", |
[(1234567890] + (, [1234567890] +)? | "2", "42", "0,618", "49,3", ... |
"3", ", 75", "" |
Eredetileg a formális nyelvek leírására jött létre, a rendszeres kifejezéseket a számítógépes nyelvek elemzésében és manipulálásában használják ; a fordítók és tolmácsok tehát ezeken alapulnak.
A dokumentum szöveges kereső eszközeihez hasonlóan használva a reguláris kifejezés leírja a közös tulajdonságokkal rendelkező karakterláncokat, annak érdekében, hogy ezeket egy szövegblokkban találja meg, és alkalmazzon egy automatizált kezelést, például kiegészítést, cserét, módosítást vagy törlést.
Számos szövegszerkesztő és a legtöbb beépített fejlesztői környezet támogatja a rendszeres kifejezéseket. A Unix segédprogramok nagy része tudja, hogyan kell natív módon használni őket. A legismertebbek a GNU grep vagy a GNU sed, amelyek a szövegszerkesztőkhöz hasonlóan ezekkel a kifejezésekkel automatikusan böngésznek egy dokumentumot, a keresési mintával kompatibilis szövegdarabok keresése közben, esetleg hozzáadáshoz, helyettesítéshez vagy törléshez.
A parancssori interfészek (vagy héjak ) egy kapcsolódó, de különálló rendszert használnak, és kevésbé kifejező módon glob (en) vagy globbing nevűek.
A rendszeres kifejezéseket gyakran használják a rendszeradminisztrációban , a szoftverfejlesztésben és a természetes nyelv feldolgozásában . Új alkalmazási területet láttak az Internet fejlesztésével és a rosszindulatú kódok vagy spam üzenetek terjesztésével . Az ezen kifejezéseket használó szűrők és robotok a potenciálisan káros elemek felderítésére szolgálnak.
A formális nyelvelméletben a reguláris kifejezés egy racionális nyelvet képviselő kifejezés . Ebben az összefüggésben a reguláris kifejezések korlátozottabb kifejezőerővel bírnak: ennek a fogalomnak szélesebb jelentése van az alkalmazott számítástechnikában, mint a formális nyelvelméletben.
A reguláris kifejezés tipográfiai karakterek sorozata (amelyet angolul egyszerűbben "pattern" - " pattern " néven neveznek ) karakterláncok halmazát írják le . Például a "megkötött, megkötött, megkötött és megkötött" szavak összessége egyetlen mintába sűríthető "ex- (a? E | æ | é) quo". Az ilyen kifejezések kialakításának alapvető mechanizmusai a helyettesítés, csoportosítás és kvantálás speciális karakterein alapulnak.
Egy függőleges sáv általában két alternatív kifejezést választ el egymástól: az "equo | aequo" az equo-t vagy az aequo-t jelöli. Szintén zárójelek segítségével meghatározható a mező és az észlelés prioritása, "(ae | e) quo" ugyanazt a halmazt jelölve "aequo | equo" -ként, és kvantálhatók a mintában jelenlévő csoportok kvantálási karakterek hozzáadásával ezen csoportosulások joga.
A leggyakoribb kvantorok a következők:
A speciális szemantikájú szimbólumokat nevezhetjük „operátoroknak”, „metakaraktereknek” vagy „speciális karaktereknek”. Azokat a karaktereket, amelyek csak önmagukat képviselik, "literáloknak" nevezzük.
A reguláris kifejezések kombinálhatók, például összefűzéssel , összetettebb reguláris kifejezések előállítására.
Amikor egy karakterlánc megfelel a reguláris kifejezés által megadott leírásnak, azt mondjuk, hogy a karakterlánc és a minta között „egyezés” van, vagy hogy a minta „megegyezik” a karakterlánccal. Ez a levelezés a karakterlánc egészére vagy egy részére vonatkozhat. Például a következő mondatban: „A két csapat holtversenyben végzett, és köszöntötték egymást. ", Az" ex-æquo "alszöveg az" ex- (a? E | æ | é) quo "mintával illeszkedik.
Alapértelmezés szerint a reguláris kifejezések a kis- és nagybetűk között különböznek . Ha lehetséges, megpróbálják a mintának megfelelő legnagyobb sztringet összehangolni: állítólag „kapzsi”. Például Aa+felismeri a teljes "Aaaaaaa" karakterláncot, nem pedig az "Aaa" (falánkság) részt, de nem ismeri fel az "aaaA" (kis- és nagybetűk érzékenysége) karakterláncot.
Operátorok | Leírás | Példák | ||
---|---|---|---|---|
Reguláris kifejezés | Leírt láncok | Csatornák nincsenek leírva | ||
expr 1 expr 2 | Két kifejezés összefűzés operátora (implicit). | ab | "Ab" | "A", "b", üres karakterlánc |
. | Egy karakter és egy | . | "A", "b" stb. | üres karakterlánc, "ab" |
expr ? | Ez a kvantor megfelel annak, ami megelőzi, jelen van nulla vagy egyszer . Ha egy szövegben több egyezés létezik, akkor először megtalálja azokat, amelyek a szöveg elejére kerülnek, majd a lehető legnagyobb hosszúságot adja vissza a kezdeti pozícióból. | nál nél? | üres karakterlánc, "a" | "Aa", "b" |
kifejezés + | Ez a kvantor megfelel annak, ami megelőzi, egy vagy többször megismételve . Ha egy szövegben több egyezés létezik, akkor először megtalálja azokat, amelyek a szöveg élén vannak, majd a lehető legnagyobb hosszúságot adja vissza ebből a kezdeti pozícióból. | a + | "A", "aa", "aaaaa" stb. | üres karakterlánc, "b", "aaab" |
kifejezés * | Ez a kvantor megfelel annak, ami megelőzi, nulla vagy többször megismételve . Ha egy szövegben több egyezés létezik, akkor először megtalálja azokat, amelyek a szöveg elejére kerültek, majd a lehető legnagyobb hosszúságot adja vissza a kezdeti pozícióból. | nál nél* | üres karakterlánc, "a", "aaa" és így tovább. | "B", "aaab" |
expr 1 | 2. kifejezés | Számos alternatíva, vagyis a kitűzött unió közötti választás operátora. A lehetséges alternatívákhoz annyiszor lehet kombinálni, ahányszor szükséges. Megfelel az operátor előtt vagy után elhelyezett kifejezések egyikének . Ezek a kifejezések adott esetben üresek lehetnek, és így (x |) egyenértékű x? -Vel. | a | b | "A", "b" | üres karakterlánc, "ab", "c" |
[ lista ] | A szögletes zárójelben szereplő karakterek egyike ("karakterosztály") | [a e i o u] | "A", "e", "i" stb. | üres karakterlánc, "b", "ae" |
[^ lista ] | A szögletes zárójelben nem szereplő karakter ("karakterosztály") | [^ aeiou] | "B" stb. | üres karakterlánc, "a", "bc" |
( Expr ) | A kifejezés csoportosítása zárójelben | (észlelt) | "Észlelt" | "Észlelt", "észlelt", "észlelt" |
kifejezés { n } | A zárójeleket megelőző kifejezés pontosan n előfordulása | a {3} | "Aaa" | "Aa", "aaaa" |
kifejezés { n , m } | A zárójeleket megelőző kifejezés n és m előfordulása között | a {2.4} | "Aa", "aaa", "aaaa" | "A", "aaaaa" |
kifejezés: { n ,} | A zárójeleket megelőző kifejezés legalább n előfordulása | a {3,} | "Aaa", "aaaa", "aaaaa" stb. | "Aa" |
^ | Ez az állítmány nem felel meg egyetlen karakternek sem, de rögzít egy szükséges feltételt, amely lehetővé teszi az egyezség megtalálását az utána következőekben, jelezve, hogy a sor elején kell lennie (tehát a beviteli szöveg elején vagy egy sortörés után kell lennie). . Nem tekinthető így a reguláris kifejezés elején, másutt szó szerint. Feltételként alkalmazandó a reguláris kifejezés többi részére (és ezért az összes képviselt alternatívára vonatkozik). | ^ a "a" -ot talál a sor elején, de nem a "ba" -ban. | ||
$ | Ez az állítmány nem felel meg egyetlen karakternek sem, de rögzít egy szükséges feltételt, amely lehetővé teszi a megegyezés megteremtését az előtte levőnél, jelezve, hogy ennek egy sor végén kell lennie (tehát a beviteli szöveg végén vagy közvetlenül a sortörés előtt kell lennie). . Nem tekinthető így a reguláris kifejezés végén, máshol szó szerint. Feltételként alkalmazandó a reguláris kifejezés többi részére (és ezért az összes képviselt alternatívára vonatkozik). | a $ "a" -t talál a sor végén, de nem "ab" -ben. |
A számítástechnikában a reguláris kifejezések manipulálásának eszközét reguláris kifejezés motornak vagy reguláris kifejezés motornak nevezik . Vannak szabványok, amelyek biztosítják ezen eszközök következetes használatát.
A POSIX szabvány három szabványkészletet kínál:
A perlben szereplő reguláris kifejezések kifejező gazdagságuk és erejük miatt de facto is szabványok. Miközben követik saját fejlődésüket, például a PCRE könyvtár eredeténél vannak . Az ECMAScript az ECMA-262 szabvány dokumentumában javasol egy olyan szabványt is, amelyet például a JavaScript használ .
A jelölések vagy szemantikájuk kissé eltérhet az egyes reguláris kifejezõmotoroktól. Csak részben vagy részben felelhetnek meg ezeknek a szabványoknak, vagy felajánlhatják saját funkcióikat, például a GNU-t vagy a .NET-keretrendszert . Mindegyikük sajátosságait a cikk később tárgyalja.
A karakterosztály karakterkészlet. Különböző módon határozható meg:
Karakterosztályok hozhatók létre: [0-9ab]kijelöli a „0” - „9” karakterekből, valamint az „a” és „b” betűkből álló készletet. Néhány könyvtár lehetővé teszi a karakterosztályok metszését is.
A szögletes zárójelek között a metakaraktereket szó szerint értelmezzük: [.?*]kijelöli a karakterekből álló készletet ". ","? "És" * ".
A leggyakrabban használt karakterosztályokat általában a reguláris kifejezés motorral szállítjuk. Az alábbi táblázatban leltárt készítenek ezekről az osztályokról.
A POSIX könyvtár definiál osztályokat kezdetben ASCII majd tágabb értelemben az egyéb karakterkódolás, attól függően, hogy a területi .
Az Unicode-ban és olyan nyelvekben, mint a perl, a karakterkészletek a karaktertulajdonságok fogalmán keresztül kerülnek meghatározásra. Ez lehetővé teszi a karakterek csoportjának kijelölését kategóriájuk szerint (például: betű, nyitó írásjelek, záró írásjelek, elválasztó, vezérlő karakter), az írás irányának megfelelően (például balról jobbra vagy jobbról balra), az ábécé függvényében (példák: latin, cirill, görög, hiragana); a blokk kiosztás szerint, vagy akár a POSIX karakterosztályokkal megegyező elvek szerint (erről a témáról olvassa el a Reguláris kifejezések és az Unicode részt ).
POSIX | Nem szabványos | perl, Python | Vim | Jáva | Unicode | ASCII | Leírás |
---|---|---|---|---|---|---|---|
\p{ASCII} | [\x00-\x7F] | ASCII karakterek | |||||
[:alnum:] | \p{Alnum} | A-Za-z0-9 | Alfanumerikus karakterek | ||||
[:word:] | \w | \w | \w | A-Za-z0-9_ | Alfanumerikus karakterek és "_" | ||
\W | \W | \W | ^A-Za-z0-9_ | A szavakat nem alkotó karakterek | |||
[:alpha:] | \a | \p{Alpha} | \p{L} vagy \p{Letter} | A-Za-z | Ábécés karakterek | ||
[:blank:] | \s | \p{Blank} | \t | Szóköz és fül | |||
\b | \< \> | \b | (?<=\W)(?=\w)|(?<=\w)(?=\W) | A szavak kezdő és befejező pozíciói | |||
\B | \B | (?<=\W)(?=\W)|(?<=\w)(?=\w) | Pozíciók, amelyek nem felelnek meg a szó elejének vagy végének | ||||
[:cntrl:] | \p{Cntrl} | \p{Cc} vagy \p{Control} | \x00-\x1F\x7F | Vezérlő karakterek | |||
[:digit:] | \d | \d | \p{Digit} vagy \d | \p{Nd} vagy \p{Decimal_Digit_Number} | 0-9 | Tizedesjegyek | |
\D | \D | \D | \P{Nd} vagy \P{Decimal_Digit_Number} | ^0-9 | Valami nem tizedes | ||
[:graph:] | \p{Graph} | \x21-\x7E | Látható karakterek | ||||
[:lower:] | \l | \p{Lower} | \p{Ll} vagy \p{Lowercase_Letter} | a-z | Kisbetűk | ||
[:print:] | \p | \p{Print} | \x20-\x7E | Nyomtatható karakterek | |||
[:punct:] | \p{Punct} | \p{P} vagy \p{Punctuation} | ][!"#$%&'()*+,./:;<=>?@\^_`{|}~- | Írásjelek | |||
[:space:] | \s | \_s | \p{Space} vagy \s | \p{Z} vagy \p{Separator} | \t\r\n\v\f | Szóköz karakterek | |
\S | \S | \S | \P{Z} vagy \P{Separator} | ^ \t\r\n\v\f | Valami mást, mint űr karaktert | ||
[:upper:] | \u | \p{Upper} | \p{Lu} vagy \p{Uppercase_Letter} | A-Z | Nagybetűvel | ||
[:xdigit:] | \x | \p{XDigit} | A-Fa-f0-9 | Hexadecimális számjegyek | |||
\A | Karakterlánc kezdete | ||||||
\Z | Karakterlánc vége |
Például a POSIX szabványban [[:upper:]ab]egy karakter egyezik a halmaz között, amelyet nagybetűs és kisbetűs "a" és "b" alkot. Az ASCII szabványban ezt a reguláris kifejezést írnák [A-Zab].
Az egyenértékűségi osztály fogalmát nem szabad összekeverni a karakterosztály fogalmával.
Például az FR területi beállításban az [= e =] osztály összesíti az összes {e, é, è, ë, ê} betűt.
Ez azt jelenti, hogy összeválogatva az {e, é, è, ë, ê} betűk ugyanabban a karakterkészletben jelennek meg, a d után és az f előtt .
A legtöbb szabványos és reguláris kifejező motor fejlett funkciókat kínál. Különösen :
A használt jelölések nagyon változatosak. Ez a fejezet egyrészről egyesíti a különböző megvalósításokra jellemző jelöléseket, másrészt a szabványosító társaságot.
A POSIX szabvány a konfigurálható reguláris kifejezések szabványának biztosításával igyekezett orvosolni a szintaxis és a funkcionalitás terjedését. Áttekintést kaphat a Unix-regex nyelvjárások kézikönyvének elolvasásával, beleértve a GNU / Linuxot is . Azonban még ez a szabvány sem tartalmazza a Perl reguláris kifejezésekhez hozzáadott összes funkciót.
Végül a POSIX támogatja az olyan platformok támogatását, amelyek nem ASCII-alapú karakterkészletet használnak, nevezetesen az EBCDIC-t , és részleges területi támogatást nyújt egyes metakarakterekhez.
Alapvető reguláris kifejezésekA Unix világ segédprogramjai, mint például a sed , a GNU grep , az ed vagy a VI , alapértelmezés szerint a POSIX BRE („ Basic Regular Expression ”) szabványát használják. Ebben a zárójel, a zárójel, a "? "És a" + "szimbólum nem metakarakter: csupán önmagukat képviseli. Ahhoz, hogy szemantikájukat metakarakterekből vegyék át, el kell kerülniük őket a "\" szimbólummal.
Példa: a reguláris kifejezés egyezik az (ab.)+"(abc) +" kifejezéssel, de nem az "abcabd" kifejezéssel, amelyre \(ab.\)\+alkalmas.
Kiterjesztett reguláris kifejezésekPOSIX reguláris kifejezés (ERE ) gyakran támogatják közüzemi Unix és GNU / Linux disztribúció által többek között a -E zászló a parancssor hívása ezekhez a programokhoz. Az alapvető reguláris kifejezésekkel ellentétben felismerik azokat a karaktereket, amelyeket korábban metakarakterként láttak. Ezért szó szerint kell értelmezni őket.
Az itt megadott példák többsége POSIX kiterjesztett reguláris kifejezés.
Menekülési szekvenciákAhogy a karakterek (, ), [, ], ., *, ?, +, ^, |, $, -és a \használt speciális szimbólumokat kell hivatkozni egy escape szekvencia , ha a szó szoros értelmében jelöli a megfelelő karaktert. Ez úgy történik, hogy hátralövéssel előzzük meg őket \.
Hasonló kiterjesztéseket használnak az emacs szerkesztőben , amely a POSIX szabványtól eltérő parancskészletet használ; de ugyanazokat a szabályos kifejezéseket használja kibővített jelöléssel. A kiterjesztett reguláris kifejezéseket a vim , a vi továbbfejlesztett verziója is támogatja .
Kiterjesztett operátor (nem POSIX) | Leírás | Példa |
---|---|---|
\{m,n\} | A kiterjesztett jelöléssel, ez létrehoz egy egyéni határolt kvantor, amely lehetővé teszi m hogy pontosan egyezik n előfordulásai a fenti, ahol m és n két egész szám úgy, hogy m < n . A két paraméter bármelyike elhagyható: ha az első m paraméter elmarad, akkor az alapértelmezett értéke 0; ha az n második paramétert elhagyjuk, de a vessző jelen van, akkor azt végtelennek tekintjük; ha az n második paraméter , valamint az elválasztó vessző elhagyásra kerül, akkor az alapértelmezett értéket megegyezik az első m paraméterrel . | Lásd az alábbi példákat. |
\( \) | Kiterjesztett jelölés esetén a zárójeleket (menekülési sorrendben) csoportosítva határozzuk meg az alternatívák halmazát, vagy bármilyen szabályos részkifejezést (kivéve a sor elejét és végét) a kvantor alkalmazásához. Ezenkívül ezek a zárójelek számozott befogási csoportot határoznak meg, amelyet fel lehet használni a helyettesítésekhez (ezután a helyettesítési lánc befogott csoportjaival hivatkozunk arra, ahol n az 1 és 9 közötti befogási csoport száma, az egész talált láncot ábrázolva ). $n$& | Lásd az alábbi példákat. |
Ezenkívül sok más menekülési szekvencia kerül hozzáadásra az előre definiált karakterosztályok jelölésére. Ezek az egyes segédprogramokra specifikusak, vagy néha változnak a verziótól vagy a platformtól függően (ugyanakkor hosszú ideig stabilak voltak az emacs-ban, amely ezeknek a kiterjesztéseknek az előfutára volt, amelyeket más szerzők részben korlátozottan vagy másképp valósítottak meg).
A Python a POSIX reguláris kifejezéseken alapuló reguláris kifejezéseket használ, bizonyos kiterjesztésekkel vagy eltérésekkel.
A POSIX-kompatibilis elemek a következők:
A szekvencia \bjelöli a visszalépés karaktert ( 0x08ASCII kompatibilis kódolással), ha egy karakterosztályon belül használjuk, és különben a szó határát.
A BSD operációs rendszer a Henry Spencer által írt regex könyvtárat használja . A POSIX 1003.2 szabványsal kompatibilis, ezt a könyvtárat a MySQL (a REGEXP és a NOT REGEXP operátorokkal) és a PostgreSQL (a „~” operátorral és annak változataival) is használja.
A Tcl nyelv szabályos kifejezőmotorja Henry Spencer fejlesztéséből származik a BSD könyvtár fejlesztése után. A reguláris kifejezéseket Advanced Regular Expressions (vagy ARE) nevezzük, és kissé eltérnek a POSIX kiterjesztett reguláris kifejezéseitől. Az alap- és a kiterjesztett reguláris kifejezések is támogatottak.
Más motorokkal ellentétben ez a motor PLC alapon működik, ami kevésbé hatékony, ha rögzítésre vagy visszacsatolásra van szükség, de egyébként hatékonyabb.
A Perl különösen gazdag bővítménykészletet kínál. Ez a programozási nyelv nagyon sikeres a reguláris kifejezés operátorok jelenléte miatt magában a nyelvben. Az általa kínált kiterjesztések más programok számára is elérhetők lib PCRE ( Perl-Compatible Regular Expressions , Perl-kompatibilis reguláris kifejezések könyvtárának szó szerint ) néven. Ezt a könyvtárat eredetileg az Exim levelezőszerverhez írták , de most más projektek veszik át, mint a Python , az Apache , a Postfix , a KDE , az Analog , a PHP és a Ferite .
A Perl 6 specifikációk rendszeresítik és kiterjesztik a reguláris expressziós rendszer mechanizmusát. Ráadásul jobban integrálódik a nyelvbe, mint a Perl 5-be. A nyom visszaadásának ellenőrzése ott nagyon jó. A Perl 6 regex rendszere elég hatékony ahhoz, hogy parsereket írjon , elemző pluginok használata nélkül. A reguláris kifejezések a szubrutinok, a nyelvtanok pedig az osztály egyik formája . A mechanizmust a Parrot assemblerben a PGE modul , a Perl 6 Parrot implementációja és Haskell a Pugs implementációban valósítja meg . Ezek a megvalósítások fontos lépést jelentenek a teljes Perl 6 fordító felépítésében . A Perl 6 regexp néhány funkciója, például a megnevezett rögzítések, a Perl 5.10 óta vannak beépítve.
A PHP a jelölések két formáját támogatja: a POSIX szintaxist (POSIX 1003.2), és sokkal gazdagabb és hatékonyabb PCRE könyvtárat (Perl Compatible Regular Expression).
A PHP-ben kritizált egyik hiba a karaktersorozatok korlátozott támogatásához kapcsolódik, annak ellenére, hogy főleg szöveg feldolgozására használják, mivel a szöveget csak 8 bites kódolású karakterkészletben lehet ábrázolni, anélkül, hogy egyértelműen meghatároznánk, melyik kódolást használnak. A gyakorlatban ezért szükség van a PHP támogatási könyvtárak hozzáadására a szövegek kódolásához és dekódolásához, már csak azért is, hogy azokat képviseljék az UTF-8-ban. Azonban még az UTF-8 esetében is azonnal felmerül a probléma a reguláris kifejezések szemantikájával, mivel a karakterek ekkor változó hosszúságú kódolással rendelkeznek, ami megköveteli a reguláris kifejezések bonyolultabbá tételét. Választható PHP kiterjesztések ezért fejlesztették ki, hogy hozzon létre egy új adattípust szöveget, annak érdekében, hogy megkönnyítse a feldolgozás (és végső soron összeegyeztethető Perl6 amely, mint Haskell , akkor natív teljes Unicode támogatás).
Az ICU meghatároz egy hordozható könyvtárat a nemzetközi szövegszerkesztéshez. Ezt először C nyelven (az ICU4C nevű verzió) vagy a Java platformra (az ICU4J nevű verziót) fejlesztették ki. A portok (vagy adaptációk) sok más nyelven is elérhetők, a C (vagy C ++ ) nyelv számára kifejlesztett könyvtár segítségével .
Az ICU-ban használható reguláris kifejezések felveszik a Perl-ben szereplő reguláris kifejezések jellemzőit, de kiegészítik őket, hogy teljes körű támogatást nyújtsanak az Unicode karakterkészlet számára (a még folyamatban lévő szabványosítással kapcsolatos kérdéseket lásd a következő szakaszban). A jelentésüket azzal is tisztázzák, hogy a reguláris kifejezéseket függetlenítik a dokumentumokban használt kódolt karakterkészlettől, mivel az Unicode karakterkészletet használják belső pivot kódolásként.
Ez azért van, mert a Perl (vagy PCRE) reguláris kifejezések nem hordozhatók különböző kódolt karakterkészleteket használó dokumentumok feldolgozásához, és nem támogatják megfelelően a többbájtos (változó hosszúságú) kódolású karakterkészleteket, mint például az ISO 2022 , a Shift-JIS vagy az UTF-8 ). , vagy egy vagy több, több mint 8 bites bináris egységen kódolva (például UTF-16 ), mivel ezeknek a halmazoknak a tényleges kódolása bájt szekvenciaként a platformtól függ. - a feldolgozáshoz használt forma (a bájtok sorrendje egy 8 bitnél nagyobb szó).
Az ICU ezt úgy oldja meg, hogy olyan feldolgozást alkalmaz, amely belsőleg egyetlen 32 bites készletet használ, és támogatja a teljes univerzális karakterkészletet (UCS), ahogyan azt az ISO / IEC 10646 meghatározza és szemantikailag meghatározza az Unicode szabvány. (Ami hozzáadja a szabványhoz a a karakterekre vonatkozó informatív vagy normatív tulajdonságok, valamint az automatikus szövegfeldolgozásra vonatkozó ajánlások, ezek közül az ajánlások egy része opcionális vagy informatív, mások pedig szabványossá váltak és magába az Unicode szabványba integrálódtak, mások végül ISO vagy nemzeti szabvány szerint megszerezték a nemzetközi szabvány státuszát egyes országok).
Az ICU a következő kiterjesztéseket támogatja, közvetlenül reguláris kifejezésekben vagy egy karakterosztály reguláris kifejezésében (között […]):
Az ICU rendszeres kifejezései jelenleg a legerősebbek és kifejezőbbek a többnyelvű dokumentum-feldolgozásban. Ezek nagyrészt az alapja a (még folyamatban) szabványosítása Unicode reguláris kifejezések (lásd alább) és egy részhalmaza van beépítve támogatja a szabványos Java nyelvű könyvtár (amely belsőleg használ hordozható karakterkészlet változó kódolás alapján UTF-16 és kiterjesztések, és amelyek kódolási egységei 16 bitek).
Az ICU egy még mindig fejlődő könyvtár. Elvileg el kell fogadnia a Perlben bejelentett összes kiterjesztést (beleértve a megnevezett rögzítéseket is), hogy biztosítsa az interoperabilitást a Perl 5, Perl 6 és PCRE-vel, valamint az ezt használó más nyelvek növekvő számával. valamint az ICU és a Perl szerzői közösen meghatározzák a közös jelölést. Az ICU azonban elsősorban az Unicode szabványban leírt szabályos kifejezésekben elfogadott kiterjesztéseket fogadja el, mivel az ICU szolgál ebben az Unicode standard mellékletben fő referenciaként.
Mindazonáltal még nem létezik olyan szabványos vagy technikai standard, amely a rendszeres kifejezések néhány fontos szempontját többnyelvű összefüggésben kezelné, ideértve:
Ez utóbbi hiányzó szempontok tisztázása érdekében további metakaraktereket kell lehetővé tenni a megtalált események ellenőrzésére vagy szűrésére, vagy pedig a visszaküldött események listájára egy szabványosított sorrendet kell alkalmazni. Az alkalmazás szerzőinek ezért éberen figyelniük kell ezekre a kérdésekre, és mindenképpen el kell olvasniuk az összes megtalált eseményt, és nem csak az elsőt, hogy el tudják dönteni, hogy az események közül melyik a legmegfelelőbb egy adott művelethez.
A reguláris kifejezéseket eredetileg az ASCII karakterekkel együtt használták . Számos reguláris kifejezés motor képes kezelni az Unicode-ot . Sok szempontból a használt kódolt karakterkészlet nem tesz különbséget, de bizonyos problémák merülnek fel az reguláris kifejezések kiterjesztésével az Unicode számára.
Az egyik kérdés az, hogy melyik belső Unicode ábrázolási formátum támogatott. Az összes parancssori reguláris kifejezés motor az UTF-8-ra számít , de a könyvtárak egy része az UTF-8-ra is számít, mások viszont csak egy UCS-2 kódolású játékra számítanak (vagy akár annak UTF-16 kiterjesztésére, amely szintén korlátozza az érvényes szekvenciákat), vagy az UCS- Csak a 4. ábrán (lásd szabványosított UTF-32 korlátozását ).
A második kérdés az, hogy támogatott-e az Unicode verziójának teljes értéktartománya. Sok motor csak az Alapszintű többnyelvű síkot , azaz 16 bites kódolható karaktereket támogatja . Csak néhány motor képes (2006-tól) kezelni a 21 bites Unicode értéktartományokat.
A harmadik kérdés az, hogy az ASCII konstrukciókat hogyan lehet kiterjeszteni az Unicode-ra.
A gyakorlatban azonban ez gyakran nem így van:
Egy másik terület, ahol eltérések vannak, az eset-érzéketlenségi mutatók értelmezése.
Egy másik válasz az Unicode-ra az volt, hogy karaktersorozatokat vezetett be az Unicode-blokkokhoz és az Unicode karakterek általános tulajdonságait:
Megjegyzések:
Legalább három algoritmuscsalád létezik, amelyek meghatározzák, hogy egy karakterlánc megfelel-e egy reguláris kifejezésnek.
A legrégebbi, explicitnek nevezett megközelítés a reguláris kifejezés determinisztikus véges automatává (DFA) történő fordításán alapul . Az építkezés egy ilyen automata reguláris kifejezéssel a mérete m van egy komplexitása méretű és a memóriában az O (2 m ) , de lehet végrehajtani egy sor méretű n egy időben O (n) .
Egy alternatív megközelítés, amelyet implicitnek nevezünk, egy nem determinisztikus véges automata szimulációjából áll, azáltal, hogy az egyes AFD-ket menet közben felépíti, és a következő lépésben megszabadul tőle. Ez a megközelítés elkerüli az előző megközelítés exponenciális összetettségét, de a végrehajtási idő O-ban nő (mn) . Ezek az algoritmusok gyorsak, de bizonyos funkciókat, például az alszövegek visszavételét és a nem mohó kvantálást nehéz megvalósítani.
A harmadik megközelítés abból áll, hogy a mintát a karakterlánccal elválasztással és értékeléssel hasonlítjuk össze (" visszacsatolás "). Algoritmikus bonyolultsága a legrosszabb esetben exponenciális, például olyan mintákkal, mint például (a|aa)*b, de a gyakorlatban jó eredményeket ad. Rugalmasabb és nagyobb kifejezőerőt tesz lehetővé, például az alszövegek visszavételének egyszerűsítésével.
Néhány megvalósítás megkísérli egyesíteni a különböző megközelítések tulajdonságait, kezdve a keresést egy AFD-vel, majd szükség esetén elválasztással és értékeléssel.