Reguláris kifejezések

A reguláris kifejezések olyan számítógépes programokban használatos formális  nyelvek , amelyek szöveggel dolgoznak , hogy metakarakterek ( helyettesítő karakterek ) használatán alapuló részkaraktereket keressenek és kezeljenek a szövegben . A kereséshez mintakarakterláncot használnak ( angol minta , oroszul gyakran "sablonnak", "maszknak" nevezik), amely karakterekből és metakarakterekből áll, és beállítja a keresési szabályt. A szöveggel végzett manipulációkhoz egy helyettesítő karakterlánc is megadásra kerül, amely speciális karaktereket is tartalmazhat.   

Jellemzők

Egyes szövegszerkesztők és segédprogramok reguláris kifejezéseket használnak szövegek keresésére és helyettesítésére. Például reguláris kifejezések használatával megadhat olyan mintákat, amelyek lehetővé teszik:

A reguláris kifejezések sokkal összetettebb keresési vagy csereminták megadását is lehetővé teszik.

A reguláris kifejezéssel végzett munka eredménye a következő lehet:

Ha reguláris kifejezést használunk a szöveg helyettesítésére, akkor a munka eredménye egy új szöveges karakterlánc lesz, amely a forrásszöveg, amelyből a talált (a mintához illeszkedő) részkarakterláncok eltávolításra kerülnek, és a helyettesítő karakterláncok behelyettesítésre kerülnek (esetleg a forrásszöveg elemzése során megjegyzett karaktercsoportok módosítják) . A szövegmódosítás speciális esete a talált minta minden előfordulásának eltávolítása - amelyhez a helyettesítő karakterlánc üresen van megadva.

A UNIX disztribúciókkal együtt szállított segédprogramok (beleértve a sed szerkesztőt és a grep szűrőt ) az elsők között népszerűsítették a reguláris kifejezéseket a szövegszerkesztéshez. Sok modern programozási nyelv rendelkezik beépített támogatással a reguláris kifejezésekhez. Ezek közé tartozik az ActionScript , Perl , Java [1] , PHP , JavaScript , .NET - keretrendszer [2] , Python , Tcl , Ruby , Lua , Gambas , C++ ( 2011-es szabvány ), Delphi , D , Haxe és mások.

Történelem

A reguláris kifejezések eredete az automataelméletben , a formális nyelvek elméletében és a formális nyelvtanok Chomsky -féle osztályozásában [3] található .

Ezek a területek a számítási modelleket (automaták) és a formális nyelvek leírásának és osztályozásának módjait tanulmányozzák . Az 1940 -es években Warren McCulloch és Walter Pitts egy idegrendszert írt le , amely egy egyszerű automatát használ egy neuron modelljeként .

Stephen Kleene matematikus később leírta ezeket a mintákat „ reguláris halmazoknak ” nevezett matematikai jelölésével.

Ken Thompson beépítette őket a QED szerkesztőbe , majd a UNIX ed szerkesztőbe. Azóta a reguláris kifejezéseket széles körben használják a UNIX és UNIX-szerű segédprogramokban, mint például az expr , awk , Emacs , vi , lex és Perl .

A Perl és Tcl reguláris kifejezései Henry Spencer által írt megvalósításból származnak . Philip Hazel kifejlesztette a PCRE ( Perl -kompatibilis reguláris kifejezések )  könyvtárát  , amelyet számos modern eszközben használnak, mint például a PHP és az Apache . .

A formális nyelvek elméletében

A reguláris kifejezések konstansokból és operátorokból állnak, amelyek karakterlánc -készleteket , illetve az azokra vonatkozó műveletek halmazait határozzák meg. A következő állandók vannak meghatározva:

és a következő műveleteket:

A modern programozási nyelvekben (különösen a PCRE -ben ) található reguláris kifejezések nagyobb erővel bírnak, mint a formális nyelvelméletben reguláris kifejezések; különösen számozott háttérhivatkozásaik vannak . Ez lehetővé teszi számukra, hogy ne csak a reguláris nyelvtanok által leírt karakterláncokat elemezzék, hanem bonyolultabbak is, különösen a környezetfüggetlen nyelvtanok [5] [6] .

Szintaxis

Szimbólumábrázolás

Szabályos karakterek ( literálok ) és speciális karakterek ( metakarakterek )

A reguláris kifejezésekben szereplő karakterek többsége önmagát képviseli, kivéve a speciális karaktereket [ ] \ / ^ $ . | ? * + ( ) { } (ez a készlet különbözik a reguláris kifejezések különböző típusainál, lásd: A reguláris kifejezések változatai ), amelyek karakterrel \(fordított perjel) megszökve, szöveges karakterként jeleníthetők meg. Egy egész karaktersorozatot kiléphet, ha azt \Qés közé zárja \E.

Példa Megfelelőség
a\.? a.vagya
a\\\\b a\\b
a\[F\] a[F]
\Q+-*/\E +-*/

Más speciális karakterek is hasonlóképpen ábrázolhatók (a karakterkészletek, amelyek megszakítást igényelnek, az adott megvalósítástól függően változhatnak). Azok a karakterek egy része, amelyek egyik vagy másik megvalósításában nem igényelnek kihagyást (például szögletes zárójelek < >), olvashatósági okokból kihagyhatók.

Bármely karakter

A metakarakter .(pont) bármely egyedi karaktert jelent, de bizonyos megvalósításokban az újsor karaktert kivéve.

Karakter helyett .használhatja [\s\S](minden szóköz és nem szóköz karakter, beleértve az újsor karaktert is).

Karakterosztályok (karakterkészletek)

A szögletes zárójelben [ ]lévő karakterkészletet karakterosztálynak nevezzük, és lehetővé teszi, hogy jelezze a reguláris kifejezés értelmezőjének, hogy a felsorolt ​​karakterek valamelyike ​​megjelenhet egy karakterlánc adott helyén. Konkrétan [абв]beállítja a három megadott karakter valamelyikének előfordulásának lehetőségét a szövegben, és [1234567890]beállítja a megfelelést az egyik számjegyhez. Lehetőség van karaktertartományok megadására: például [А-Яа-я]megfelel az orosz ábécé összes betűjének, kivéve a "Ё" és "ё" [7] betűket . A reguláris kifejezések egyes megvalósításai lehetővé tehetik, hogy a karakterosztályok ne csak karaktereket, hanem teljes karakterláncokat is tartalmazzanak. [nyolc]

Ha olyan karaktereket szeretne megadni, amelyek nem szerepelnek a megadott készletben, használja a ^szögletes zárójelben lévő karaktert, például [^0-9]a számokon kívül minden más karaktert jelent.

A legegyszerűbb módja annak, hogy speciális karaktereket adjunk hozzá a készlethez meneküléssel. A modern reguláris kifejezések azonban a hagyományos megközelítést is öröklik – lásd: Hagyományos reguláris kifejezések .

Egyes karakterosztályok speciális metakarakterekkel helyettesíthetők:

Szimbólum Lehetséges egyenértékű [9] Megfelelőség
\d [0-9] Цифровой символ
\D [^0-9] Нецифровой символ
\s [ \f\n\r\t\v] Пробельный символ
\S [^ \f\n\r\t\v] Непробельный символ

Пример: Выражение вида ^\S.* или ^[^ \f\n\r\t\v].* будет находить строки, начинающиеся с непробельного символа

\w[10] [A-Za-z0-9_] Буквенный или цифровой символ или знак подчёркивания; буквы ограничены латиницей

Пример: Выражение вида \w+ будет находить и выделять отдельные слова

\W[11] [^A-Za-z0-9_] Любой символ, кроме буквенного или цифрового символа или знака подчёркивания

Pozíció egy karakterláncon belül

A következő karakterek lehetővé teszik a reguláris kifejezés elhelyezését a szövegelemekhez képest: sor eleje és vége, szóhatárok.

Teljesítmény Pozíció Példa Megfelelőség
^ Szöveg eleje (vagy sor ?m módosítóval) ^a aaa aaa
$ Szöveg vége (vagy sor ?m módosítóval) a$ aaa aaa
\b szószegély a\b aaa aaa
\ba aaa aaa
\B Egy szó sem határ \Ba\B aaa aaa
\G Korábbi sikeres keresés \Ga aaa aaa(a keresés a 4. helyen állt meg - ahol nem találták a)

Speciális karakterek

\n - soremelés

\r - kocsi vissza

Csoport megnevezése

A zárójelek a műveletek hatókörének és elsőbbségének meghatározására szolgálnak . Egy csoporton belüli minta egészeként kerül feldolgozásra, és számszerűsíthető. Például a kifejezés (тр[ау]м-?)*egy formátumú sorozatot fog találni трам-трам-трумтрам-трум-трамтрум.

Felsorolás

Függőleges sáv választja el az érvényes opciókat. Például gray|greygyufa grayvagy grey. Emlékeztetni kell arra, hogy az opciók felsorolása balról jobbra történik, ahogyan azok meg vannak jelölve.

Ha egy összetettebb reguláris kifejezésen belül kíván opciókat megadni, akkor azt egy csoportba kell zárni. Például írjon le egy karakterláncot gray|greyvagy . Egykarakteres alternatívák esetén a lehetőséget részesítjük előnyben , mivel a karakterosztályokkal való összehasonlítás egyszerűbb, mint egy csoport feldolgozása az összes lehetséges módosító ellenőrzésével és visszacsatolás generálásával. gr(a|e)ygraygreygr[ae]y

Számszerűsítés (szekvenciák keresése)

A karakter, karakterosztály vagy csoport utáni kvantor határozza meg, hogy az előző kifejezés hányszor fordulhat elő. Vegye figyelembe, hogy egy kvantor egynél több karakterre hivatkozhat egy reguláris kifejezésben, ha az egy karakterosztály vagy -csoport.

Teljesítmény Ismétlések száma Egyenértékű Példa Megfelelőség
? Nulla vagy egy {0,1} colou?r color,colour
* Nulla vagy több {0,} colou*r color, colourstb colouur .
+ Egy vagy több {1,} colou+r colourstb colouur . (de nem color)
Teljesítmény Ismétlések száma Példa Megfelelőség
{n} Pontosan n - szer colou{3}r colouuur
{m,n} m - től n -ig , beleértve colou{2,4}r colouur. colouuur_colouuuur
{m,} Nem kevesebb, mint m colou{2,}r colouur, colouuurstb colouuuur .
{,n} legfeljebb n colou{,3}r color... colour_ colouur_colouuur

A sorozatot gyakran használják .*tetszőleges számú karakter jelölésére a reguláris kifejezés két része között.

A karakterosztályok kvantorokkal kombinálva lehetővé teszik a valós szövegekkel való egyeztetést. Például számoszlopok, telefonszámok, postai címek, HTML jelölőelemek stb.

Ha a karakterek { } nem alkotnak kvantort, a speciális jelentésüket figyelmen kívül hagyja.

Mohó és lusta számszerűsítés Példa a mohó és lusta kifejezések használatára

A kifejezés (<.*>)megfelel egy karakterláncnak, amely teljes egészében több HTML jelölőcímkét tartalmaz.

<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>

Az egyes címkék kiemeléséhez alkalmazhatja a kifejezés lusta változatát: (<.*?>) Nem a fent látható teljes sornak felel meg, hanem az egyes címkéknek (színnel kiemelve):

<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>

Egyes megvalósításokban a reguláris kifejezésekben lévő kvantorok a lehető leghosszabb karakterláncnak felelnek meg (a kvantorok greedy , angolul  greedy ). Ez jelentős probléma lehet. Például egy kifejezéstől gyakran elvárják, hogy HTML - címkéket(<.*>) találjon a szövegben . Ha azonban egynél több HTML-címke van a szövegben, akkor a több címkét tartalmazó teljes sor megfelel a kifejezésnek.

<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>

Ezt a problémát kétféleképpen lehet megoldani.

  1. Vegye figyelembe azokat a karaktereket, amelyek nem egyeznek a kívánt mintával ( <[^>]*>a fenti esetre).
  2. Határozzon meg egy kvantort nem kapzsiként ( lazy , angol  lazy ) – a legtöbb implementáció ezt úgy teszi meg, hogy kérdőjelet ad hozzá.

A lusta kvantorok használata inverz problémához vezethet, ha egy kifejezés túl rövid, különösen az üres karakterlánc.

Kapzsi Lusta
* *?
+ +?
{n,} {n,}?

Szintén gyakori probléma a mohó és lusta kifejezéseknél a kifejezések változatai közötti iteráció visszatérési pontjai. A kvantor minden iterációja után pontok kerülnek elhelyezésre. Ha az értelmező nem talál egyezést a kvantor után, akkor az összes beállított pontra elkezd visszaadni, onnantól eltérő módon újraszámolva a kifejezést.

Féltékeny számszerűsítés (szuperkapzsi)

Amikor kifejezést keres egy karakterláncban, az értelmező megközelítőleg a következő útvonalon halad: (a+a+)+a aaaaa

  1. aaaaa
  2. aaaa
  3. aaaaa
  4. aaa
  5. aaaaa
  6. aaaa
  7. aaaaa- és csak ezután, az összes visszatérési pont ellenőrzése után áll le.

Féltékeny kvantor használatakor csak az algoritmus első lépése kerül végrehajtásra.

A reguláris (mohó) kvantifikációtól eltérően a féltékeny (birtokló) kvantifikáció nem csak a leghosszabb opciót próbálja megtalálni, de azt sem teszi lehetővé, hogy az algoritmus visszatérjen az előző keresési lépésekhez, hogy a reguláris kifejezés többi részére találjon lehetséges egyezéseket.

A féltékeny kvantorok használata növeli a keresési sebességet, különösen olyan esetekben, amikor a karakterlánc nem egyezik a reguláris kifejezéssel. Ezen kívül féltékenységi kvantifikátorok segítségével kiküszöbölhetők a nem kívánt egyezések.

Kapzsi Irigy
* *+
? ?+
+ ++
{n,} {n,}+
Példa Megfelelőség
ab(xa)*+a abxaabxaa; de nem , mivel a levél már el van foglalva abxaabxaaa

Ez analóg az atomcsoportosítással .

Csoportosítás

Visszajelzés

A csoportosítás egyik módja a korábban megtalált karaktercsoportok ( alkarakterláncok , blokkok , megjelölt részkifejezések , rögzítések ) újrafelhasználása. A kifejezés feldolgozása során a csoporton belüli minta által talált részsztringek külön memóriaterületen tárolódnak, és egytől kezdődő számot kapnak. Minden egyes részkarakterlánc megfelel egy zárójelpárnak a reguláris kifejezésben. A csoportos számszerűsítés nem befolyásolja a mentett eredményt, azaz csak az első előfordulás kerül mentésre. Általában legfeljebb 9 számozott, 1-től 9-ig számozott részkarakterlánc támogatott, de egyes értelmezők lehetővé teszik, hogy többel is dolgozzon. Ezt követően ezen a reguláris kifejezésen belül a -tól \1-ig jelölés használható \9egy korábban talált részstringgel való egyezés ellenőrzésére.

Például a reguláris kifejezés (та|ту)-\1megegyezik a та-таvagy karakterlánccal ту-ту, de kihagyja a karakterláncot та-ту.

A korábban talált részkarakterláncok is használhatók reguláris kifejezéssel való helyettesítéskor. Ebben az esetben ugyanazok a szimbólumok kerülnek be a helyettesítő szövegbe, mint magában a kifejezésben.

Csoportosítás visszajelzés nélkül

Ha a csoportot csak csoportosításra használjuk, és eredményére később nincs szükség, akkor használhatja a típus csoportosítását . Egy ilyen csoportosítás eredményéhez nincs külön memóriaterület, és ennek megfelelően szám sincs hozzárendelve. Ez pozitív hatással van a kifejezések végrehajtásának sebességére, de csökkenti az olvashatóságot. (?:шаблон)

Atomcsoportosítás

Egy nézet atomi csoportosítása , akárcsak a visszacsatolás nélküli csoportosítás, nem hoz létre visszacsatolást. Ezzel szemben egy ilyen csoportosítás tiltja a visszalépést a karakterláncon keresztül, ha a minta egy részét már megtalálták. (?>шаблон)

Példa Megfelelőség Csoportok létrehozva
a(bc|b|x)cc abccaxcc

abccaxcc

abccaxcc

abccaxcc

a(?:bc|b|x)cc abccaxcc,abccaxcc Nem
a(?>bc|b|x)cc abccaxcc

de nem abccaxcc: variáns xtalálható, többi figyelmen kívül hagyva

Nem
a(?>x*)xa nem található axxxa: mindenki xelfoglalt, és a csoporton belül nincs visszaút

Az atomi csoportosítás még gyorsabb, mint a nyílt hurkú csoportosítás, és CPU-időt takarít meg a kifejezés többi részének végrehajtása közben, mivel megakadályozza, hogy a csoporton belül a többi opciót ellenőrizzék, ha az egyik opciót már megtalálták. Ez nagyon hasznos, ha sokféle lehetőséget kínáló csoportokat optimalizál.

Ez analóg a féltékeny számszerűsítéssel .

Módosítók

A módosítók az előfordulás pillanatától a reguláris kifejezés vagy az ellenkező módosító végéig érvényesek. Egyes értelmezők alkalmazhatják a módosítót a teljes kifejezésre, nem pedig az előfordulás pillanatától kezdve.

Szintaxis Leírás
(?i) Magába foglalja kis- és nagybetűk érzéketlensége _  _
(?-i) Kikapcsol
(?s) Magába foglalja pontegyezési mód a soremelés és a kocsivissza karakterek számára
(?-s) Kikapcsol
(?m) Szimbólumok ^és $csak egyezést okoznak újsor karakterek után és előtt
(?-m) a szöveg kezdetével és végével
(?x) Magába foglalja módban anélkül, hogy figyelembe venné a reguláris kifejezés részei közötti szóközöket, és lehetővé teszi #a megjegyzésekhez való használatát
(?-x) Kikapcsol

A módosító csoportok egy csoportba vonhatók össze: (?i-sm). Egy ilyen csoport be- és kikapcsolja a és imódokat . Ha csak egy csoporton belül szükséges a módosítók használata, akkor a csoporton belül a módosítók és a kettőspont után a kívánt minta jelenik meg. Például megtalálja , de nem . sm(?-i)(?i:tv)setTVsetTVSET

Megjegyzések

Ha megjegyzéseket szeretne hozzáadni egy reguláris kifejezéshez, használhatja az űrlap megjegyzéscsoportjait . Az ilyen csoportokat az értelmező teljesen figyelmen kívül hagyja, és nem ellenőrzi, hogy előfordul-e a szövegben. Például a kifejezés megegyezik a karakterlánccal . (?#комментарий)А(?#тут комментарий)БАБ

Nézz előre és hátra

A legtöbb reguláris kifejezés-megvalósításnak megvan egy módja annak, hogy a keresett szövegrész előtt vagy után megjelenő környező szöveget "átnézve" keressen (de nem tartalmazza). A negatív keresést ritkábban használják, és „biztosítja”, hogy a megadott egyezések, éppen ellenkezőleg, ne forduljanak elő a keresett szövegrészlet előtt vagy után.

Teljesítmény Nézet típusa Példa Megfelelőség
(?=шаблон) pozitív előrelátás Людовик(?=XVI) ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL
(?!шаблон) Negatív előretekintés (tagadással) Людовик(?!XVI) ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL
(?<=шаблон) Pozitív visszatekintés (?<=Сергей )Иванов Сергей Иванов, Игорь Иванов
(?<!шаблон) Negatív visszatekintés (tagadással) (?<!Сергей )Иванов Сергей Иванов, Игорь Иванов

Keresés feltétel szerint

A reguláris kifejezések számos megvalósításában a már megtalált értékek alapján kiválasztható, hogy a reguláris kifejezés egyik vagy másik helyén az ellenőrzés melyik utat járja be.

Teljesítmény Magyarázat Példa Megfelelőség
(?(?=если)то|иначе) Ha a vizsgálati művelet sikeres, akkor a következő rész végrehajtásra kerül то, ellenkező esetben a rész végrehajtásra kerül иначе. A négy keresési művelet bármelyike ​​használható egy kifejezésben. Ne feledje, hogy a keresési művelet nulla szélességű, ezért a részeknek тоpozitív kikeresés vagy иначеnegatív keresés esetén tartalmazniuk kell a kikeresési műveletből származó sablon leírását. (?(?<=а)м|п) мам,пап
(?(n)то|иначе) Ha az n -edik csoport értéket adott vissza, akkor a feltétel szerinti keresést a minta hajtja végre то, egyébként a minta иначе. (а)?(?(1)м|п) мам,пап

Flags

Egyes nyelveken (például JavaScriptben ) az ún. „jelzők”, amelyek kiterjesztik a RegExp funkcióit. A jelzők a reguláris kifejezés után kerülnek megadásra (a jelzők sorrendje nem számít). Tipikus zászlók:

  • g  - globális keresés (a keresési mintával minden találat feldolgozásra kerül);
  • i  - a kisbetű nem számít;
  • m  - többsoros keresés;
  • s  - a szöveget egy sorként kezeli, ebben az esetben a metakarakter .(pont) bármely egyedi karakterhez illeszkedik, beleértve az újsor karaktert is;
  • u  - unicode értelmezés. A kifejezés tartalmazhat speciális Unicode-mintákat, például /\p{Lu}/ nagybetűket.

A zászló a minta után van megadva, például így: . /[0-9]$/m

A reguláris kifejezések változatai

Alapvető POSIX reguláris kifejezések

( angol  alapvető reguláris kifejezések (BRE)). Hagyományos UNIX reguláris kifejezések . Az alapvető reguláris kifejezés szintaxist a POSIX már elavult , de a visszafelé kompatibilitási okokból még mindig széles körben használják. Sok UNIX segédprogram alapértelmezés szerint használ ilyen reguláris kifejezéseket.

Ez a verzió metakaraktereket tartalmaz:

  • .;
  • [ ];
  • [^ ];
  • ^(csak a kifejezés elején érvényes);
  • $(csak a kifejezés végén érvényes);
  • *;
  • \{ \} - kezdeti verzió a { };
  • \( \) - kezdeti verzió a ( );
  • \n, ahol n  egy 1-től 9-ig terjedő szám.

Sajátosságok:

  • A csillagnak az egyetlen karakternek megfelelő kifejezés után kell lennie. Példa: [xyz]*.
  • A kifejezést érvénytelennek kell tekinteni. Egyes esetekben a karakterlánc nulla vagy több ismétlésével egyezik meg . Más esetekben megegyezik a karakterlánccal .\(блок\)*блокблок*
  • Egy karakterosztályon belül a speciális karakterértékek általában figyelmen kívül maradnak. Különleges esetek:
    • Ahhoz, hogy egy karaktert ^a készlethez adjon, nem szabad először oda tenni.
    • Ahhoz, hogy egy karaktert -a készlethez adjunk, először vagy utoljára kell ott elhelyezni. Például:
      • DNS név sablon, amely tartalmazhat betűket, számokat, mínusz és határoló pont: [-0-9a-zA-Z.];
      • bármely karakter a mínusz és a szám kivételével: [^-0-9].
    • Szimbólum hozzáadásához [vagy ]egy készlethez először oda kell helyezni. Például:
      • [][ab]egyezések ], [, avagy b.

Kibővített POSIX reguláris kifejezések

( angol  kiterjesztett reguláris kifejezések (ERE)). A szintaxis alapvetően ugyanaz, mint a hagyományos.

  • Eltávolítottuk a fordított perjel használatát a metakaraktereknél { }és a ( ).
  • A metakarakter előtti fordított perjel törli a különleges jelentését (lásd: Speciális karakterek megjelenítése ).
  • Az elméletileg szabálytalan tervezést elutasítják .\n
  • Hozzáadott metakarakterek +, ?, |.

Perl- kompatibilis reguláris kifejezések

A Perl- kompatibilis reguláris kifejezések (PCRE) még a POSIX ERE-nél is gazdagabb szintaxissal rendelkeznek .  Emiatt sok alkalmazás a Perl-kompatibilis reguláris kifejezés szintaxist használja.

Unicode-kompatibilis reguláris kifejezések

Az Unicode  egy karakterkészlet, amelynek célja, hogy meghatározza az összes karaktert és szimbólumot minden emberi nyelvről, legyen az élő és holt. A sok nyelvre tervezett reguláris kifejezések így nincsenek meghatározott karakterkészletekhez kötve, hanem elfogadott szabályok szerint írják le azokat. Így például a nagybetűk keresésére szolgáló kifejezés bármely ábécében így néz ki: /\p{Lu}/.

Néhány reguláris kifejezés unicode:
teljesítmény funkcionalitás
lehetséges rövid forma lehetséges hosszú forma
Levelek
\p{L} \p{Letter} bármilyen betűt bármilyen nyelven
\p{Ll} \p{Lowercase_Letter} azok kisbetűi (kisbetűi), amelyekben nagybetűs írásmód van
\p{Lu} \p{Uppercase_Letter} nagybetűk (nagybetűk) a kisbetűs írásmóddal rendelkezők számára
\p{Lt} \p{Titlecase_Letter} kisbetűs szó elején megjelenő nagybetű
\p{L&} \p{Cased_Letter} olyan betű, amelyben kis- és nagybetűk is vannak
\p{Lm} \p{Modifier_Letter} betűként használt speciális karakterek
\p{Lo} \p{Other_Letter} olyan karakter vagy ideogram, amelynek nincs kis- vagy nagybetűs írásmódja
Különleges szimbólumok
\p{M} \p{Mark} más karakterekkel kombinálható karakterek (pl. ékezetek, umlautok, burkoló zárójelek)
\p{Mn} \p{Non_Spacing_Mark} beszúrt karakter, amelyet más karakterekkel kombinálhat anélkül, hogy extra szélességet venne fel
\p{Mc} \p{Spacing_Combining_Mark} beszúrt karakterek más karakterekkel kombinálva, extra szélességet foglalva (mint sok keleti nyelvben)
\p{Me} \p{Enclosing_Mark} karaktereket körbeölelő karakterek. Például kör, négyzet stb.
Szóközök és elválasztók
\p{Z} \p{Separator} bármilyen szóköz vagy láthatatlan elválasztó
\p{Zs} \p{Space_Separator} olyan szóköz karakterek, amelyek láthatatlanok, de szélesek
\p{Zl} \p{Line_Separator} sorelválasztó jel U+2028
\p{Zp} \p{Paragraph_Separator} bekezdésjel U+2029
Matematikai szimbólumok
\p{S} \p{Symbol} matematikai szimbólumok, valuta szimbólumok, pszeudográfiai szimbólumok (keretek) stb.
\p{Sm} \p{Math_Symbol} bármilyen matematikai szimbólum
\p{Sc} \p{Currency_Symbol} bármilyen valuta szimbólum
\p{Sk} \p{Modifier_Symbol} kombinált karakter (jel) magának a karakternek és a mark karakternek a kombinációjaként
\p{So} \p{Other_Symbol} különféle szimbólumok, nem matematikai, nem pénznem szimbólumok vagy ezek kombinációi
Numerikus karakterek
\p{N} \p{Number} bármilyen digitális karakter bármilyen nyelven
\p{Nd} \p{Decimal_Digit_Number} számok nullától kilencig bármilyen nyelven
\p{Nl} \p{Letter_Number} olyan szám, amely betűnek, például római számnak tűnhet
\p{No} \p{Other_Number} felső vagy alsó indexként ábrázolt szám, vagy olyan szám, amely nem számjegyekből áll (kivéve az ideográfiai szkriptekből származó számokat)
Központozás
\p{P} \p{Punctuation} bármilyen írásjelet
\p{Pd} \p{Dash_Punctuation} bármilyen kötőjel vagy gondolatjel
\p{Ps} \p{Open_Punctuation} bármilyen nyitó zárójel
\p{Pe} \p{Close_Punctuation} bármilyen záró zárójel
\p{Pi} \p{Initial_Punctuation} bármilyen nyitó idézet
\p{Pf} \p{Final_Punctuation} bármilyen záró idézet
\p{Pc} \p{Connector_Punctuation} írásjelek, például aláhúzásjelek vagy szóösszetételek
\p{Po} \p{Other_Punctuation} bármilyen írásjelet, amely nem pont, zárójel, idézőjel vagy csatlakozó
Vezérlő karakterek
\p{C} \p{Other} láthatatlan vezérlőkarakterek és nem használt pozíciók
\p{Cc} \p{Control} ASCII vagy Latin-1 vezérlőkarakterek: 0x00-0x1F és 0x7F-0x9F
\p{Cf} \p{Format} láthatatlan formázásjelzők
\p{Co} \p{Private_Use} bármely személyes használatra fenntartott pozíció
\p{Cs} \p{Surrogate} az UTF-16 kódolású pótpárok fele
\p{Cn} \p{Unassigned} minden olyan pozíció, amelyhez nincs szimbólum hozzárendelve

Fuzzy reguláris kifejezések

Egyes esetekben célszerű reguláris kifejezéseket használni a természetes nyelvű , azaz emberek által írt szövegrészletek elemzésére, amelyek esetleg elírási hibákat vagy nem szabványos szóhasználatot tartalmaznak. Ha például felmérést végez (mondjuk egy webhelyen), „melyik metróállomást használja”, kiderülhet, hogy a látogatók a „Nevszkij Prospekt” kifejezést a következőképpen jelezhetik:

  • Nyevszkij
  • Nyevszk. Ave.
  • Új sugárút
  • emb. Gribojedov-csatorna (a „Griboedov-csatorna” a Nyevszkij Prospekt metróállomás második kijáratának neve)

Itt a szokásos reguláris kifejezések nem alkalmazhatók, elsősorban amiatt, hogy a mintákban szereplő szavak nem feltétlenül egyeznek pontosan (fuzzy), de ennek ellenére célszerű lenne leírni a minta elemei közötti strukturális függőségeket. a reguláris kifejezésekkel például esetünkben azt jelzik, hogy az egyezés lehet a „Nevszkij Prospekt” VAGY „Griboedov-csatorna” mintával, sőt, a „Prospect” rövidítve „pr”-re vagy hiányozhat, az „Eb” rövidítés pedig lehet. " a "Csatorna" elé kerülhet.

Ez a feladat hasonló a teljes szöveges kereséshez , abban különbözik, hogy itt egy rövid töredéket kell összehasonlítani egy mintakészlettel, a teljes szöveges keresésnél pedig éppen ellenkezőleg, a minta általában egy, míg a szövegrészlet nagyon nagy , vagy a lexikális egyértelműsítési probléma , amely azonban nem teszi lehetővé a mintaelemek közötti strukturáló kapcsolatok megadását.

Van néhány olyan könyvtár , amely megvalósítja a reguláris kifejezési mechanizmust a fuzzy összehasonlítás lehetőségével:

  • A TRE egy ingyenes C-könyvtár, amely POSIX-szerű reguláris kifejezés szintaxist használ (stabil projekt);
  • A FREJ egy nyílt forráskódú Java-könyvtár, amely Lisp-alakú szintaxist használ, és hiányzik a hagyományos reguláris kifejezések sok jellemzője, de a szövegrészletek különféle automatikus cseréjére összpontosít (béta verzió).

Megvalósítások

  • Az NFA ( nem determinisztikus  véges állapotú automaták  - nem determinisztikus véges automaták ) egy mohó visszakövető algoritmust használ , amely egy bizonyos sorrendben ellenőrzi a reguláris kifejezés összes lehetséges kiterjesztését, és kiválasztja az első megfelelő értéket. Az NFA képes részkifejezéseket és visszahivatkozásokat kezelni. De a visszaállítási algoritmus miatt a hagyományos NFA többször is ellenőrizheti ugyanazt a helyet, ami negatívan befolyásolja a munka sebességét. Mivel a hagyományos NFA az első talált egyezést veszi át, előfordulhat, hogy nem találja meg a leghosszabb egyezést (ezt a POSIX szabvány írja elő , és vannak az NFA-nak olyan módosításai, amelyek megfelelnek ennek a követelménynek - GNU sed ). Ezt a reguláris kifejezési mechanizmust használják például a Perl -ben , a Tcl -ben és a .NET -ben .
  • A DFA ( angol.  determinisztikus véges állapotú automaták  - determinisztikus véges automaták ) időben lineárisan működnek, mert nem használnak visszagörgetést, és soha nem ellenőrzik a szöveg egyetlen részét sem. Garantáltan megtalálják a lehető leghosszabb húrt. A DFA csak egy végső állapotot tartalmaz, így nem kezel vissza hivatkozásokat, és nem támogatja az explicit kiterjesztési konstrukciókat sem, vagyis nem tudja kezelni a részkifejezéseket sem. A DFA például a lexben és az egrepben használatos .

Lásd még

Jegyzetek

  1. docs.oracle.com . Letöltve: 2013. augusztus 20. Az eredetiből archiválva : 2013. szeptember 9..
  2. MSDN . Letöltve: 2011. július 11. Az eredetiből archiválva : 2012. szeptember 15..
  3. Aho A., Ulman J. Az elemzés, fordítás és összeállítás elmélete. Szintaktikai elemzés. - Világ. - M. , 1978. - T. 2.
  4. Sok könyvben ∪, + vagy ∨ szerepel | helyett.
  5. Nyikita Popov. A reguláris kifejezések igazi ereje (2012. június 15.). Letöltve: 2019. május 30. Az eredetiből archiválva : 2019. május 16. Fordítás: A reguláris kifejezések igazi ereje archiválva : 2019. május 30. a Wayback Machine -nél .
  6. Vlagyimir Komendantszkij. Változós reguláris kifejezések illesztési problémája // Trends in Functional Programming : 13th International Symposium, TFP 2012, St Andrews, UK, 2012. június 12-14, Revised Selected Papers. — Springer, 2013. — P. 149–150. — ISBN 9783642404474 .
  7. Betűsorozatok használatához be kell állítani a megfelelő kódlapot, amelyen ezek a sorozatok sorrendben haladnak a megadott karakterekig. Az orosz nyelv esetében ezek a Windows-1251 , az ISO 8859-5 és az Unicode , mivel a DOS-855- ben, a DOS-866 és a KOI8-R orosz betűk nem tartoznak egy teljes csoportba, vagy nincsenek ábécé sorrendben. Különös figyelmet kell fordítani a diakritikus betűkre , mint például az orosz Ё / ё, amelyek általában a fő karaktertartományon kívül találhatók.
  8. UTS #18: Unicode reguláris  kifejezések . Letöltve: 2021. augusztus 8. Az eredetiből archiválva : 2021. augusztus 8..
  9. A reguláris kifejezés motorjának megvalósításától függően változik
  10. Van egy ekvivalens jelölés [[:word:]]
  11. Van egy ekvivalens jelölés [^[:word:]]

Irodalom

  • Friedl, J. Reguláris kifejezések = Mastering Regular Expressions. - Szentpétervár. : "Péter" , 2001. - 352 p. — (Programozói könyvtár). — ISBN 5-318-00056-8 .
  • Smith, Bill. Módszerek és algoritmusok a karakterláncokon történő számításhoz (regexp) = Számítási minták karakterláncokban. - M . : "Williams" , 2006. - 496 p. — ISBN 0-201-39839-7 .
  • Forta, Ben. Tanulja meg saját reguláris kifejezéseit. 10 perc leckénként = Sams Tanítsd meg magad reguláris kifejezésekre 10 perc alatt. - M . : "Williams" , 2005. - 184 p. — ISBN 5-8459-0713-6 .
  • Jan Goyverts, Steven Levitan. Reguláris kifejezések. Szakácskönyv = Szabályos kifejezések: Szakácskönyv. - Szentpétervár. : "Symbol-Plus" , 2010. - 608 p. - ISBN 978-5-93286-181-3 .
  • Melnikov SV Perl professzionális programozóknak. Reguláris kifejezések. - M . : "Binom" , 2007. - 190 p. — (Az információs technológia alapjai). — ISBN 978-5-94774-797-3 .
  • Michael Fitzgerald. Reguláris kifejezések. Alapok. - M. : "Williams" , 2015. - 144 p. — ISBN 978-5-8459-1953-3 .

Linkek