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.
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ší.
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 .
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] .
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ý znakMetaznak .(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_] | Любой символ, кроме буквенного или цифрового символа или знака подчёркивания |
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) |
\n - posun řádku
\r - návrat vozíku
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 трам-трам-трумтрам-трум-трамтрум.
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.
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.
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
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 .
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é vazbyPokud 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átoryModifiká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ářeChcete-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 . (?#комментарий)А(?#тут комментарий)БАБ
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í) | (?<!Сергей )Иванов | Сергей Иванов, Игорь Иванов |
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)м|п) | мам,пап |
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:
Příznak je uveden za vzorem, například takto: . /[0-9]$/m
( 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:
Zvláštnosti:
( Anglické rozšířené regulární výrazy (ERE)). Syntaxe je v podstatě stejná jako ta tradiční.
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.
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 |
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:
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í:
Formální jazyky a formální gramatiky | |
---|---|
Obecné pojmy | |
Typ 0 | |
Typ 1 |
|
Typ 2 | |
Typ 3 | |
rozebrat |