Regulární výrazy

Regulární výrazy jsou formální jazyk  používaný v počítačových programech, které pracují s textem pro vyhledávání a manipulaci s podřetězci v textu , založený na použití metaznaků ( zástupných znaků ) . K vyhledávání se používá řetězec vzoru ( anglicky pattern , v ruštině se často nazývá „šablona“, „maska“), skládající se ze znaků a metaznaků a nastavující pravidlo vyhledávání. Pro manipulaci s textem je navíc určen náhradní řetězec, který může obsahovat i speciální znaky.   

Funkce

Regulární výrazy používají některé textové editory a nástroje pro vyhledávání a nahrazování textu. Pomocí regulárních výrazů můžete například určit vzory, které vám umožní:

Regulární výrazy také umožňují zadat mnohem složitější vzory vyhledávání nebo nahrazování.

Výsledkem práce s regulárním výrazem může být:

Pokud se k nahrazení textu použije regulární výraz, pak výsledkem práce bude nový textový řetězec, který je zdrojovým textem, ze kterého se odstraní nalezené podřetězce (shodné se vzorem) a dosadí se náhradní řetězce (příp. upraveno skupinami znaků zapamatovaných při analýze ze zdrojového textu) . Speciálním případem úpravy textu je odstranění všech výskytů nalezeného vzoru – pro který je náhradní řetězec zadán prázdný.

Sada nástrojů (včetně editoru sed a filtru grep ) dodávaná s distribucemi UNIX byla mezi prvními, které popularizovaly regulární výrazy pro zpracování textu. Mnoho moderních programovacích jazyků má vestavěnou podporu regulárních výrazů. Mezi ně patří ActionScript , Perl , Java [1] , PHP , JavaScript , jazyky .NET Framework ​​[2] , Python , Tcl , Ruby , Lua , Gambas , C++ ( standard 2011 ), Delphi , D , Haxe a další.

Historie

Původy regulárních výrazů leží v teorii automatů , teorii formálních jazyků a Chomského klasifikaci formálních gramatik [ 3] .

Tyto obory se zabývají výpočtovými modely (automaty) a způsoby popisu a klasifikace formálních jazyků . Ve 40. letech 20. století Warren McCulloch a Walter Pitts popsali neurální systém využívající jednoduchý automat jako model pro neuron .

Matematik Stephen Kleene později popsal tyto vzory pomocí své matematické notace nazvané „ regulární množiny “.

Ken Thompson je zabudoval do editoru QED a poté do editoru UNIX ed . Od té doby se regulární výrazy staly široce používanými v UNIXu a utilitách podobných UNIXu, jako je expr , awk , Emacs , vi , lex a Perl .

Regulární výrazy v Perlu a Tcl pocházejí z implementace napsané Henrym Spencerem . Philip Hazel vyvinul knihovnu PCRE ( Perl -compatible regular expressions )   , která se používá v mnoha moderních nástrojích, jako je PHP a Apache .

V teorii formálních jazyků

Regulární výrazy se skládají z konstant a operátorů , které definují množiny řetězců a množiny operací s nimi. Jsou definovány následující konstanty:

a následující operace:

Regulární výrazy nalezené v moderních programovacích jazycích (zejména PCRE ) mají větší sílu než to, co se v teorii formálních jazyků nazývá regulární výrazy; zejména mají očíslované zpětné odkazy . To jim umožňuje analyzovat řetězce popsané nejen běžnými gramatikami, ale i složitějšími, zejména bezkontextovými gramatikami [5] [6] .

Syntaxe

Reprezentace symbolů

Běžné znaky ( literály ) a speciální znaky ( metaznaky )

Většina znaků v regulárním výrazu reprezentuje samy sebe, s výjimkou speciálních znaků [ ] \ / ^ $ . | ? * + ( ) { } (tato sada se liší pro různé typy regulárních výrazů, viz Variety regulárních výrazů ), které mohou být escapovány znakem \(zpětným lomítkem), aby se reprezentovaly jako textové znaky. Můžete uniknout celé sekvenci znaků tak, že ji uzavřete mezi \Qa \E.

Příklad Shoda
a\.? a.neboa
a\\\\b a\\b
a\[F\] a[F]
\Q+-*/\E +-*/

Ostatní speciální znaky mohou být reprezentovány podobně (znakové sady, které vyžadují escapování, se mohou lišit v závislosti na konkrétní implementaci). Část znaků, které v té či oné implementaci nevyžadují escapování (například lomené závorky < >), lze z důvodu čitelnosti escapovat.

Libovolný znak

Metaznak .(tečka) znamená jakýkoli jednotlivý znak, ale v některých implementacích s výjimkou znaku nového řádku.

Místo znaku .můžete použít [\s\S](všechny znaky s mezerami a znaky bez mezer, včetně znaku nového řádku).

Třídy znaků (sady znaků)

Sada znaků v hranatých závorkách [ ]se nazývá třída znaků a umožňuje interpretovi regulárních výrazů sdělit, že jeden z uvedených znaků se může objevit na daném místě v řetězci. Zejména [абв]nastavuje možnost výskytu jednoho ze tří specifikovaných znaků v textu a [1234567890]nastavuje shodu s jednou z číslic. Je možné specifikovat rozsahy znaků: například [А-Яа-я]odpovídá všem písmenům ruské abecedy, kromě písmen "Ё" a "ё" [7] . Některé implementace regulárních výrazů mohou dovolit, aby třídy znaků zahrnovaly nejen znaky, ale také celé řetězce. [osm]

Pokud chcete zadat znaky, které nejsou zahrnuty v zadané sadě, použijte znak ^v hranatých závorkách, například [^0-9]znamená jakýkoli jiný znak než čísla.

Přidání speciálních znaků do sady escapováním je nejjednodušší způsob. Moderní regulární výrazy však také přebírají tradiční přístup – viz Tradiční regulární výrazy .

Některé třídy znaků lze nahradit speciálními metaznaky:

Symbol Možný ekvivalent [9] Shoda
\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_] Любой символ, кроме буквенного или цифрового символа или знака подчёркивания

Umístění v řetězci

Následující znaky umožňují umístit regulární výraz vzhledem k textovým prvkům: začátek a konec řádku, hranice slov.

Výkon Pozice Příklad Shoda
^ Začátek textu (nebo řádek s modifikátorem ?m) ^a aaa aaa
$ Konec textu (nebo řádek s modifikátorem ?m) a$ aaa aaa
\b hranice slova a\b aaa aaa
\ba aaa aaa
\B Žádná hranice slova \Ba\B aaa aaa
\G Předchozí úspěšné hledání \Ga aaa aaa(hledání se zastavilo na 4. pozici - kde nebylo nalezeno a)

Speciální znaky

\n - posun řádku

\r - návrat vozíku

Označení skupiny

Závorky se používají k definování rozsahu a priority operací . Vzor ve skupině je zpracováván jako celek a lze jej kvantifikovat. Například výraz (тр[ау]м-?)*najde posloupnost tvaru трам-трам-трумтрам-трум-трамтрум.

Výčet

Platné možnosti odděluje svislý pruh. Například gray|greyzápalky graynebo grey. Je třeba si uvědomit, že výčet možností se provádí zleva doprava, jak jsou naznačeny.

Pokud chcete zadat seznam možností uvnitř složitějšího regulárního výrazu, musí být uzavřen ve skupině. Například gray|greynebo gr(a|e)ypopište řetězec graynebo grey. V případě jednoznakových alternativ je preferována možnost gr[ae]y, protože srovnání s třídou znaků je jednodušší než zpracování skupiny s kontrolou všech jejích možných modifikátorů a generováním zpětné vazby.

Kvantifikace (hledání sekvencí)

Kvantifikátor za znakem, třídou znaků nebo skupinou určuje, kolikrát se může předchozí výraz vyskytnout. Všimněte si, že kvantifikátor může odkazovat na více než jeden znak v regulárním výrazu, pouze pokud se jedná o třídu nebo skupinu znaků.

Výkon Počet opakování Ekvivalent Příklad Shoda
? Nula nebo jedna {0,1} colou?r color,colour
* Nula nebo více {0,} colou*r color, colouratd colouur .
+ Jeden nebo více {1,} colou+r colouratd colouur . (ale ne color)
Výkon Počet opakování Příklad Shoda
{n} Přesně nkrát _ colou{3}r colouuur
{m,n} Od m do n včetně colou{2,4}r colouur.. colouuur_colouuuur
{m,} Ne méně než m colou{2,}r colouur, colouuuratd colouuuur .
{,n} ne více než n colou{,3}r color... colour_ colouur_colouuur

Sekvence se často používá .*k označení libovolného počtu libovolných znaků mezi dvěma částmi regulárního výrazu.

Třídy znaků v kombinaci s kvantifikátory umožňují shodu se skutečnými texty. Například sloupce čísel, telefonních čísel, poštovních adres, prvků HTML značek atd.

Pokud znaky { } netvoří kvantifikátor, jejich speciální význam se ignoruje.

Chamtivá a líná kvantifikace Příklad použití lakomých a líných výrazů

Výraz (<.*>)odpovídá řetězci obsahujícímu několik značek HTML jako celek.

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

Chcete-li zvýraznit jednotlivé značky, můžete použít línou verzi tohoto výrazu: (<.*?>) Neodpovídá celému řádku zobrazenému výše, ale jednotlivým značkám (barevně zvýrazněným):

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

V některých implementacích odpovídají kvantifikátory v regulárních výrazech nejdelšímu možnému řetězci (kvantifikátory jsou greedy , anglicky  greedy ). To může být značný problém. Od výrazu se například často očekává, že najde značky HTML(<.*>) v textu . Pokud je však v textu více než jedna značka HTML, odpovídá výrazu celý řádek obsahující více značek.

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

Tento problém lze vyřešit dvěma způsoby.

  1. Zvažte znaky, které neodpovídají požadovanému vzoru ( <[^>]*>pro výše uvedený případ).
  2. Definujte kvantifikátor jako nechtěný ( lazy , anglicky  lazy ) – většina implementací vám to umožňuje přidáním otazníku za něj.

Použití líných kvantifikátorů může vést k inverznímu problému, když výraz odpovídá příliš krátkému, zejména prázdnému řetězci.

Chamtivý Líný
* *?
+ +?
{n,} {n,}?

Častým problémem jak chamtivých, tak líných výrazů jsou také návratové body pro iteraci přes varianty výrazu. Období jsou umístěna po každé iteraci kvantifikátoru. Pokud interpret nenalezne shodu za kvantifikátorem, začne se vracet pro všechny nastavené hodnoty a přepočítává výraz odtud jiným způsobem.

Žárlivá kvantifikace (superchamtivost)

Při hledání výrazu v řetězci půjde interpret přibližně po následující cestě: (a+a+)+a aaaaa

  1. aaaaa
  2. aaaa
  3. aaaaa
  4. aaa
  5. aaaaa
  6. aaaa
  7. aaaaa- a teprve potom po kontrole všech bodů návratu se zastaví.

Při použití žárlivého kvantifikátoru bude proveden pouze první krok algoritmu.

Na rozdíl od běžné (chamtivé) kvantifikace se žárlivá (vlastnická) kvantifikace nejen snaží najít nejdelší možnost, ale také neumožňuje algoritmu vrátit se k předchozím krokům hledání, aby našel možné shody pro zbytek regulárního výrazu.

Použití žárlivých kvantifikátorů zvyšuje rychlost vyhledávání, zejména v případech, kdy řetězec neodpovídá regulárnímu výrazu. K eliminaci nežádoucích shod lze navíc použít žárlivé kvantifikátory.

Chamtivý Žárlivý
* *+
? ?+
+ ++
{n,} {n,}+
Příklad Shoda
ab(xa)*+a abxaabxaa; ale ne , protože dopis je již přijat abxaabxaaa

Toto je analogické s atomovým seskupením .

Seskupování

Zpětná vazba

Jedním z použití seskupování je opětovné použití dříve nalezených skupin znaků ( podřetězce , bloky , označené podvýrazy , zachycení ). Při zpracování výrazu jsou podřetězce nalezené vzorem ve skupině uloženy v samostatné oblasti paměti a obdrží číslo začínající od jedné. Každý podřetězec odpovídá dvojici hranatých závorek v regulárním výrazu. Skupinová kvantifikace nemá vliv na uložený výsledek, tj. uloží se pouze první výskyt. Obvykle je podporováno až 9 číslovaných podřetězců, číslovaných 1 až 9, ale některé interprety umožňují pracovat s více. Následně v rámci tohoto regulárního výrazu lze zápis od \1do použít \9ke kontrole shody s dříve nalezeným podřetězcem.

Regulární výraz (та|ту)-\1bude například odpovídat řetězci та-таnebo ту-ту, ale přeskočí řetězec та-ту.

Při nahrazení regulárním výrazem lze také použít dříve nalezené podřetězce. V tomto případě jsou do nahrazujícího textu vloženy stejné symboly jako do samotného výrazu.

Seskupování bez zpětné vazby

Pokud se skupina používá pouze pro seskupování a její výsledek později není potřeba, můžete použít seskupení typu . Pro výsledek takového seskupení není přidělena samostatná paměťová oblast, a proto jí není přiřazeno číslo. To má pozitivní vliv na rychlost provádění výrazu, ale snižuje čitelnost. (?:шаблон)

Seskupení atomů

Atomické seskupení pohledu , stejně jako seskupení bez zpětné vazby, nevytváří zpětnou vazbu. Naproti tomu takové seskupení zakazuje procházet řetězcem zpět, pokud již byla část vzoru nalezena. (?>шаблон)

Příklad Shoda Vytvořené skupiny
a(bc|b|x)cc abccaxcc

abccaxcc

abccaxcc

abccaxcc

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

ale ne abccaxcc: varianta xnalezena, ostatní ignorovány

Ne
a(?>x*)xa nenalezeno axxxa: všichni jsou xzaneprázdněni a uvnitř skupiny není návratu

Atomické seskupování je ještě rychlejší než seskupování s otevřenou smyčkou a šetří čas procesoru při provádění zbytku výrazu, protože zabraňuje kontrole jakýchkoli dalších voleb ve skupině, když již byla jedna možnost nalezena. To je velmi užitečné při optimalizaci skupin s mnoha různými možnostmi.

Toto je analogické k žárlivé kvantifikaci .

Modifikátory

Modifikátory jsou platné od okamžiku výskytu do konce regulárního výrazu nebo opačného modifikátoru. Někteří interpreti mohou použít modifikátor na celý výraz, nikoli od okamžiku, kdy k němu dojde.

Syntax Popis
(?i) Zahrnuje nerozlišování malých a velkých písmen _  _
(?-i) Vypne
(?s) Zahrnuje režim shody bodů pro znaky odřádkování a návrat vozíku
(?-s) Vypne
(?m) Pouze symboly ^a $způsobí shodu po a před znaky nového řádku
(?-m) se začátkem a koncem textu
(?x) Zahrnuje režimu bez zohlednění mezer mezi částmi regulárního výrazu a umožňuje použití #pro komentáře
(?-x) Vypne

Skupiny modifikátorů lze sloučit do jedné skupiny: (?i-sm). Taková skupina zapíná a vypíná irežimy sa m. Pokud je použití modifikátorů vyžadováno pouze v rámci skupiny, je požadovaný vzor uveden uvnitř skupiny za modifikátory a za dvojtečkou. Například (?-i)(?i:tv)setnajde, TVsetale ne TVSET.

Komentáře

Chcete-li přidat komentáře k regulárnímu výrazu, můžete použít skupiny komentářů formuláře . Taková skupina je interpretem zcela ignorována a její výskyt v textu není kontrolován. Například výraz odpovídá řetězci . (?#комментарий)А(?#тут комментарий)БАБ

Podívejte se dopředu a dozadu

Většina implementací regulárních výrazů má způsob, jak hledat část textu „prohlédnutím“ (ale nezahrnujícím) okolního textu, který je před nebo za hledaným textem. Negativní vyhledávání se používá méně často a "zajišťuje", že zadané shody se naopak nevyskytují před nebo za hledaným textovým fragmentem.

Výkon Typ zobrazení Příklad Shoda
(?=шаблон) pozitivní pohled dopředu Людовик(?=XVI) ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL
(?!шаблон) Negativní pohled dopředu (s negací) Людовик(?!XVI) ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL
(?<=шаблон) Pozitivní pohled zpět (?<=Сергей )Иванов Сергей Иванов, Игорь Иванов
(?<!шаблон) Negativní zpětný pohled (s negací) (?<!Сергей )Иванов Сергей Иванов, Игорь Иванов

Hledat podle podmínky

V mnoha implementacích regulárních výrazů je možné na základě již nalezených hodnot zvolit, jakou cestou se bude kontrola na tom či onom místě v regulárním výrazu ubírat.

Výkon Vysvětlení Příklad Shoda
(?(?=если)то|иначе) Pokud je operace skenování úspěšná, provede se další část то, jinak se provede část иначе. Ve výrazu lze použít kteroukoli ze čtyř vyhledávacích operací. Všimněte si, že operace vyhledávání má nulovou šířku, takže části тоv případě pozitivního vyhledávání nebo иначеv případě negativního vyhledávání musí obsahovat popis šablony z operace vyhledávání. (?(?<=а)м|п) мам,пап
(?(n)то|иначе) Pokud n -tá skupina vrátila hodnotu, pak se vyhledávání podle podmínky provádí pomocí vzoru то, jinak podle vzoru иначе. (а)?(?(1)м|п) мам,пап

Vlajky

V některých jazycích (například v JavaScriptu ) je tzv. "vlajky", které rozšiřují funkčnost RegExp. Příznaky jsou uvedeny za regulárním výrazem (na pořadí příznaků nezáleží). Typické příznaky:

  • g  - globální vyhledávání (zpracují se všechny shody s vyhledávacím vzorem);
  • i  - nezáleží na velikosti písmen;
  • m  - víceřádkové vyhledávání;
  • s  - text je považován za jeden řádek, v tomto případě metaznak .(tečka) odpovídá libovolnému jednotlivému znaku, včetně znaku nového řádku;
  • u  - interpretace unicode. Výraz může obsahovat speciální vzory specifické pro Unicode, jako jsou /\p{Lu}/ velká písmena.

Příznak je uveden za vzorem, například takto: . /[0-9]$/m

Odrůdy regulárních výrazů

Základní regulární výrazy POSIX

( Anglické  základní regulární výrazy (BRE)). Tradiční unixové regulární výrazy . Základní syntaxe regulárního výrazu je nyní POSIXem zastaralá , ale stále je široce používána z důvodů zpětné kompatibility. Mnoho unixových nástrojů používá takové regulární výrazy ve výchozím nastavení.

Tato verze obsahuje metaznaky:

  • .;
  • [ ];
  • [^ ];
  • ^(platí pouze na začátku výrazu);
  • $(platí pouze na konci výrazu);
  • *;
  • \{ \} - počáteční verze pro { };
  • \( \) - počáteční verze pro ( );
  • \n, kde n  je číslo od 1 do 9.

Zvláštnosti:

  • Hvězdička musí následovat za výrazem, který odpovídá jednotlivému znaku. Příklad: [xyz]*.
  • Výraz by měl být považován za neplatný. V některých případech odpovídá nule nebo více opakování řetězce . V jiných odpovídá řetězci .\(блок\)*блокблок*
  • V rámci třídy znaků jsou hodnoty speciálních znaků obecně ignorovány. Speciální případy:
    • Chcete-li přidat znak ^do sady, nesmí tam být umístěn jako první.
    • Chcete-li přidat znak -do sady, musí tam být umístěn jako první nebo poslední. Například:
      • Šablona názvu DNS, která může obsahovat písmena, čísla, mínus a oddělovací tečku: [-0-9a-zA-Z.];
      • libovolný znak kromě mínus a čísla: [^-0-9].
    • Chcete-li přidat symbol [nebo ]do sady, musí se tam nejprve umístit. Například:
      • [][ab]zápasy ], [, anebo b.

Rozšířené regulární výrazy POSIX

( Anglické  rozšířené regulární výrazy (ERE)). Syntaxe je v podstatě stejná jako ta tradiční.

  • Odstraněno použití zpětných lomítek pro metaznaky { }a ( ).
  • Zpětné lomítko před metaznakem ruší jeho speciální význam (viz Reprezentace speciálních znaků ).
  • Teoreticky nepravidelný návrh je zamítnut .\n
  • Přidány metaznaky +, ?, |.

Regulární výrazy kompatibilní s Perlem

Perl- kompatibilní regulární výrazy (PCRE) mají bohatší syntaxi než dokonce POSIX ERE .  Z tohoto důvodu mnoho aplikací používá syntaxi regulárních výrazů kompatibilní s Perl.

Regulární výrazy kompatibilní s Unicode

Unicode  je znaková sada, jejímž účelem je definovat všechny znaky a symboly ze všech lidských jazyků, živých i mrtvých. Regulární výrazy navržené pro mnoho jazyků tak nejsou vázány na konkrétní znakové sady, ale popisují je podle přijatých pravidel. Takže například výraz pro hledání velkých písmen v libovolné abecedě by vypadal takto: /\p{Lu}/.

Některé výrazy regulárních výrazů jsou unicode:
výkon funkčnost
možná krátká forma možná dlouhá forma
Písmena
\p{L} \p{Letter} jakékoli písmeno v jakémkoli jazyce
\p{Ll} \p{Lowercase_Letter} malá písmena (malá písmena) těch, které mají pravopis velká
\p{Lu} \p{Uppercase_Letter} velká písmena (velká písmena) pro uživatele s malým pravopisem
\p{Lt} \p{Titlecase_Letter} velké písmeno, které se objeví na začátku malého slova
\p{L&} \p{Cased_Letter} písmeno, které má jak velká, tak malá písmena
\p{Lm} \p{Modifier_Letter} speciální znaky, které se používají jako písmena
\p{Lo} \p{Other_Letter} znak nebo ideogram, který nemá žádná velká nebo malá písmena
Speciální symboly
\p{M} \p{Mark} znaky vložené za účelem kombinace s jinými znaky (např. diakritika, přehlásky, závorky)
\p{Mn} \p{Non_Spacing_Mark} znak vložený ke spojení s jinými znaky, aniž by zabíral extra šířku
\p{Mc} \p{Spacing_Combining_Mark} znaky vkládané ke kombinaci s jinými znaky, které zabírají extra šířku (jako v mnoha orientálních jazycích)
\p{Me} \p{Enclosing_Mark} znaky, které obalují postavu. Například kruh, čtverec atd.
Mezery a oddělovače
\p{Z} \p{Separator} jakékoli mezery nebo neviditelné oddělovače
\p{Zs} \p{Space_Separator} mezery, které jsou neviditelné, ale mají šířku
\p{Zl} \p{Line_Separator} symbol oddělení čáry U+2028
\p{Zp} \p{Paragraph_Separator} znak odstavce U+2029
Matematické symboly
\p{S} \p{Symbol} matematické symboly, symboly měn, pseudografické symboly (rámce) atd.
\p{Sm} \p{Math_Symbol} jakékoli matematické symboly
\p{Sc} \p{Currency_Symbol} jakékoli symboly měn
\p{Sk} \p{Modifier_Symbol} kombinovaný znak (značka) jako kombinace samotného znaku a znaku značky
\p{So} \p{Other_Symbol} různé symboly, nematematické, neměnové symboly nebo jejich kombinace
Číselné znaky
\p{N} \p{Number} jakýkoli druh digitálních znaků v jakémkoli jazyce
\p{Nd} \p{Decimal_Digit_Number} čísla od nuly do devíti v libovolném jazyce
\p{Nl} \p{Letter_Number} číslo, které může vypadat jako písmena, například římské číslice
\p{No} \p{Other_Number} číslo reprezentované jako horní nebo dolní index nebo číslo, které se neskládá z číslic (s výjimkou čísel z ideografických písem)
Interpunkční znaménka
\p{P} \p{Punctuation} jakýkoli druh interpunkčních znamének
\p{Pd} \p{Dash_Punctuation} jakýkoli druh pomlčky nebo pomlčky
\p{Ps} \p{Open_Punctuation} jakýkoli druh otevíracích závorek
\p{Pe} \p{Close_Punctuation} jakékoli uzavírací závorky
\p{Pi} \p{Initial_Punctuation} jakýkoli druh úvodních uvozovek
\p{Pf} \p{Final_Punctuation} jakýkoli druh závěrečných uvozovek
\p{Pc} \p{Connector_Punctuation} interpunkční znaménka, jako jsou podtržítka nebo složeniny slov
\p{Po} \p{Other_Punctuation} jakýkoli druh interpunkčních znaků, které nejsou tečkami, závorkami, uvozovkami nebo spojnicemi
Řídící znaky
\p{C} \p{Other} neviditelné řídicí znaky a nevyužité pozice
\p{Cc} \p{Control} Řídicí znaky ASCII nebo Latin-1: 0x00-0x1F a 0x7F-0x9F
\p{Cf} \p{Format} neviditelné indikátory formátování
\p{Co} \p{Private_Use} jakékoli pozice vyhrazené pro osobní použití
\p{Cs} \p{Surrogate} polovina náhradních párů kódovaných v UTF-16
\p{Cn} \p{Unassigned} všechny pozice, které nemají přiřazené symboly

Fuzzy regulární výrazy

V některých případech je vhodné použít regulární výrazy k analýze fragmentů textu v přirozeném jazyce , to znamená napsaných lidmi a případně obsahujících překlepy nebo nestandardní použití slov. Pokud například provedete průzkum (řekněme na webu) „kterou stanici metra používáte“, může se ukázat, že návštěvníci mohou označit „Něvský prospekt“ jako:

  • Něvský
  • Něvsk. Ave.
  • Nový avenue
  • emb. Griboyedov Canal („Griboedov Canal“ je název druhého výstupu ze stanice metra Něvský prospekt)

Zde nejsou obvyklé regulární výrazy použitelné, především kvůli skutečnosti, že slova obsažená ve vzorech se nemusí velmi přesně shodovat (fuzzy), ale přesto by bylo vhodné popsat strukturální závislosti mezi prvky vzoru. s regulárními výrazy například v našem případě označují, že se může shodovat se vzorkem „Něvský prospekt“ NEBO „Griboedovský kanál“, navíc „Prospekt“ může být zkrácen na „pr“ nebo chybí, a zkratka „Eb. " může být umístěn před "Kanál".

Tato úloha je podobná fulltextovému vyhledávání , liší se tím, že zde musí být krátký fragment porovnán se sadou vzorů a naopak při fulltextovém vyhledávání je vzor obvykle jeden, zatímco textový fragment je velmi velký , nebo problém lexikální disambiguace , který však neumožňuje specifikovat strukturovací vztahy mezi prvky vzoru.

Existuje malý počet knihoven , které implementují mechanismus regulárních výrazů s možností fuzzy srovnání:

  • TRE je bezplatná knihovna v jazyce C používající syntaxi regulárních výrazů podobnou POSIX (stabilní projekt);
  • FREJ je open-source Java knihovna, která používá syntaxi ve tvaru Lisp a postrádá mnoho funkcí konvenčních regulárních výrazů, ale zaměřuje se na různé druhy automatických náhrad textových fragmentů (beta verze).

Implementace

  • NFA ( nedeterministické  konečné automaty  - nedeterministické konečné automaty ) používá chamtivý algoritmus zpětného sledování , který kontroluje všechny možné expanze regulárního výrazu v určitém pořadí a vybírá první vhodnou hodnotu. NFA zvládne podvýrazy a zpětné reference. Ale díky rollback algoritmu může tradiční NFA zkontrolovat stejné místo několikrát, což negativně ovlivňuje rychlost práce. Protože tradiční NFA vezme první shodu, kterou najde, nemusí najít nejdelší shodu (toto vyžaduje standard POSIX a existují modifikace NFA, které tento požadavek splňují - GNU sed ). Právě tento mechanismus regulárních výrazů se používá například v Perlu , Tcl a .NET .
  • DFA ( angl.  deterministic finite-state automata  - deterministic finite automata ) pracují lineárně v čase, protože nepoužívají rollbacky a nikdy dvakrát nekontrolují žádnou část textu. Lze zaručit, že najdou nejdelší možný řetězec. DFA obsahuje pouze konečný stav, takže nezpracovává zpětné odkazy a také nepodporuje explicitní konstrukce rozšíření, což znamená, že nemůže zpracovávat ani podvýrazy. DFA se používá například v lex a egrep .

Viz také

Poznámky

  1. docs.oracle.com . Získáno 20. srpna 2013. Archivováno z originálu 9. září 2013.
  2. MSDN . Získáno 11. července 2011. Archivováno z originálu 15. září 2012.
  3. Aho A., Ulman J. Teorie parsování, překladu a kompilace. Syntaktická analýza. - Svět. - M. , 1978. - T. 2.
  4. Mnoho knih používá ∪, + nebo ∨ místo |.
  5. Nikita Popov. Skutečná síla regulárních výrazů (15. června 2012). Staženo 30. 5. 2019. Archivováno z originálu 16. 5. 2019. Překlad: Skutečná síla regulárních výrazů archivována 30. května 2019 na Wayback Machine .
  6. Vladimír Komendantskij. Problém párování regulárních výrazů s proměnnými // Trendy ve funkcionálním programování: 13. mezinárodní symposium, TFP 2012, St Andrews, Velká Británie, 12.–14. června 2012, Revised Selected Papers. — Springer, 2013. — S. 149–150. — ISBN 9783642404474 .
  7. Chcete-li používat posloupnosti písmen, musíte nastavit správnou kódovou stránku, ve které budou tyto sekvence přecházet v pořadí od a za zadanými znaky. Pro ruský jazyk jsou to Windows-1251 , ISO 8859-5 a Unicode , protože v DOS-855 , DOS-866 a KOI8-R ruská písmena nejdou v jedné celé skupině nebo nejsou řazena abecedně. Zvláštní pozornost by měla být věnována písmenům s diakritikou , jako je ruské L / э, která jsou obvykle rozptýlena mimo rozsah hlavních znaků.
  8. UTS #18: Regulární  výrazy Unicode . Získáno 8. srpna 2021. Archivováno z originálu dne 8. srpna 2021.
  9. Liší se v závislosti na implementaci enginu regulárních výrazů
  10. Existuje ekvivalentní zápis [[:word:]]
  11. Existuje ekvivalentní zápis [^[:word:]]

Literatura

  • Friedl, J. Regulární výrazy = Zvládnutí regulárních výrazů. - Petrohrad. : "Petr" , 2001. - 352 s. — (Knihovna programátorů). — ISBN 5-318-00056-8 .
  • Smith, Bill. Metody a algoritmy pro výpočty s řetězci (regexp) = Computing Patterns in Strings. - M .: "Williams" , 2006. - 496 s. — ISBN 0-201-39839-7 .
  • Forta, Bene. Naučte se své vlastní regulární výrazy. 10 minut na lekci = Sams se naučíte regulární výrazy za 10 minut. - M .: "Williams" , 2005. - 184 s. — ISBN 5-8459-0713-6 .
  • Jan Goyverts, Steven Levitan. Regulární výrazy. Kuchařka = Regular Expressions: Cookbook. - Petrohrad. : "Symbol-Plus" , 2010. - 608 s. - ISBN 978-5-93286-181-3 .
  • Melnikov SV Perl pro profesionální programátory. Regulární výrazy. - M .: "Binom" , 2007. - 190 s. — (Základy informačních technologií). — ISBN 978-5-94774-797-3 .
  • Michael Fitzgerald. Regulární výrazy. Základy. - M. : "Williams" , 2015. - 144 s. — ISBN 978-5-8459-1953-3 .

Odkazy