Pravidelný výraz
pravidelný výraz (zkrátil jako regexp nebo regex) je řetězec to popíše celek zapadl řetězců, shodovat se k jistý syntax rozhodne. Tyto výrazy jsou používány mnoha textovými editory a pomůcky (obzvláště v Unixu operační systém) hledat skupiny textu pro jisté vzory a, například, nahradit najité řetězce s jistým jiným řetězcem.
Původ pravidelných výrazů leží v teorii automatů a formální jazykové teorii (oba se rozdělí teoretický informatika). Tato pole studují modely výpočtu (automaty) a způsoby, jak popisovat a třídit formální jazyky. Formální jazyk je nic ale soubor řetězců. V čtyřicátých létech, Warren Mcculloch a Walter Pitts popisoval nervovou soustavu modelováním neurons jako malé jednoduché automaty. Matematik, Stephen Kleene, později popisoval tyto modely, jak používá jeho matematický zápis volal pravidelné soubory. Ken Thompson zavedl tento zápis do editora qed, pak do unixu editor ed a nakonec do grep. Už od toho času, pravidelné výrazy byly široce použité v unixu a unixu-jako pomůcky takový jak: expr, awk, Emacs, vim, lex, a Perl. Většina nástrojů používá realizaci regex knihovny postavený Henry Spencer.
Pravidelné výrazy odpovídají typu 3 gramatiky Chomsky hierarchie a smět být používán popisovat pravidelný jazyk.
Pravidelné výrazy v teorii formálního jazyka
Pravidelné výrazy sestávají z konstant a operátorů, kteří označují soubory řetězců a operace přes tyto soubory, příslušně. Daný konečná abeceda a Sigma; následující konstanty jsou definovány:
- (vyprázdnit soubor) a se vyprázdnit; naznačovat soubor a se vyprázdnit;
- (vyprázdnit řetězec) a epsilon; naznačovat soubor {a epsilon;}
- (doslovný charakter) v a Sigma; naznačovat soubor {#rquote#lquote}
- (zřetězení) RS naznačovat soubor {a alpha; a beta; | a alpha; v R a a beta; v S }. Například {“ab”, “c #lquote} {“d”, “ef #lquote} = {“abd”, “abef”, “cd”, “cef #lquote}.
- (dal odbor) R U S naznačovat odbor souboru R a S.
- (Kleene hvězda) R* označit nejmenší superset R to obsahuje a epsilon; a je zavřen pod zřetězením řetězce. Toto je soubor všech řetězců, které mohou být vyrobeny concatenating nulou nebo více řetězců v R. Například, {“ab”, “c #lquote} * = {a epsilon;, “ab”, “c”, “abab”, “abc”, “taxi”, “cc”, “ababab”,...}.
Někdy doplňkový operátor ~ je přidán; ~R označuje soubor všech řetězců přes a Sigma; to být ne v R. V tom případě výslední operátoři tvoří Kleene algebru. Doplňkový operátor je nadměrný: to může vždy být vyjádřeno tím, že jen používá jiné operátory.
Příklady:
- U b * označí {“#rquote, a epsilon;, “b”, “bb”, “bbb”,...}
- (U b) * označuje soubor všech řetězců sestávat z ' a ' b , včetně prázdného řetězce
- b * (ab *) * stejný
- ab * (c U a epsilon;) označuje soubor řetězců začínat ' ', pak nulový nebo více ' b a konečně volitelně ' c '.
- (bb U (bb) * aa U (bb) * (ab U ba) (bb) * (ab U ba)) * označuje soubor všech řetězců, které obsahují sudé číslo ' b a číslo ' je dělitelný tři.
My můžeme také studovat výraznou sílu uvnitř formalizmu. Jak příklad se ukáže, různé pravidelné výrazy mohou vyjádřit stejný jazyk: formalizmus je nadměrný.
To je možné psát algoritmus který pro dva dané pravidelné výrazy se rozhodne zda popsané jazyky jsou se rovnat - nezbytně, to redukuje každý výraz k minimální deterministický konečný státní automat a stanoví zda oni jsou isomorphic (ekvivalent).
Do jakém rozsahu může tato nadbytečnost být odstraněna? Můžeme najít zajímavou podmnožinu pravidelných výrazů to je ještě úplně výrazné? Kleene hvězda a odbor souboru jsou zřejmě požadovaní, ale možná my můžeme omezit jejich použití. Toto dopadá být překvapivě těžký problém. Jak jednoduchý jak pravidelné výrazy jsou, to dopadá není tam žádná metoda systematicky přepsat je k nějaké normální formě. Oni nejsou axiomatizable finitely. Tak my musíme uchýlit se k jiným metodám. Toto vede k hvězdnému výškovému problému.
“základní” unix regexp syntax je nyní definovaná jak zastaralá POSIX, ale je ještě široce užitý na účely zpětné kompatibility. Většina unixových pomůcek (grep, sed...) používat to standardně.
V této syntaxi, nejvíce charaktery jsou zpracované jak literals - oni si odpovídají jen sám (“#rquote zápasy “#rquote, “abc” odpovídá “abc”, etc). Výjimky jsou volány metacharacters:
| . | Odpovídá nějakému jedinému charakteru |
| [ ] | Odpovídá jedinému charakteru to je obsahováno uvnitř hranatých závorek - [abc] odpovídá si “#rquote, “b”, nebo “c”. [- z] odpovídá nějakému malému písmenu. |
| [^ ] | Zápasy jediný charakter, který není obsahoval uvnitř hranatých závorek - [^-z] odpovídá nějakému jedinému charakteru, který není malé písmeno |
| ^ | Odpovídá startu linky |
| $ | Odpovídá konci linky |
| \\( \\) | Zacházet s výrazem uzavřeným v hranatých závorkách jako jednoduchý blok |
| * | Odpovídat poslední “blokové” nule nebo více časů - “\ \ (abc \ \) *” odpovídá prázdnému řetězci nebo “abc”, nebo “abcabc”, a tak dále |
| \\{x,y\\} | Odpovídat poslednímu “bloku” přinejmenším x a ne více než y časy - “\ \ {3, 5 \ \}” odpovídá “aaa”, “aaaa” nebo “aaaaa”. |
Není tam žádná reprezentace souborového odborového operátora v této syntaxi.
Příklady:
- #rquote. u” odpovídá některému tři-slovo dopisu končit “u”
- “[hc] u” odpovídá “klobouku” a “kočce”
- “[^ b] u” odpovídá některému tři-slovo dopisu končit “u” a ne začínat ' b '.
- “^ [hc] u” odpovídá “klobouku” a “kočce” ale jediný u začátku linky
- “[hc] u $” odpovídá “klobouku” a “kočce” ale jediný u konce linky
POSIX moderní (prodloužené) regexps
Modernější “prodloužený” regexp může často být používán s moderními unixovými pomůckami tím, že zahrnuje příkazovou linkovou vlajku “- E”.
POSIX prodloužené regexps jsou podobné v syntaxi k tradičnímu unixovému regexp, s některými výjimkami. Následující metacharacters jsou přidány:
| + | Odpovídat poslednímu “bloku” jeden nebo více časů - “ba +” odpovídá “ba”, “bekot”, “baaa” a tak dále |
| ? | Odpovídat poslední “blokové” nule nebo jedněm časům - “ba?” zápasy “b” nebo “ba” |
| | | Výběr (nebo dal odbor) operátor: zápas jeden výraz dříve nebo výraz po operátorovi - “abc | def” odpovídá “abc” nebo “def”. |
Také, opačná lomítka jsou odstraněna: \ \ {... \ \} se stojí {...} a \ \ (... \ \) se stojí (...)
Příklady:
- “[hc] + u” se hodí k “klobouku”, “kočka”, “hhat”, “si povídat”, “hcat”, “ccat” et cetera
- “[hc]? u” odpovídá “klobouku”, “kočka” a “u”
- “([ cC] u | [dD] og)” odpovídá “kočce”, “kočce”, “psovi” a “psovi”
Příklady:
- #rquote. \ \. (\ \ (| \ \ ))” se hodí k řetězci “a.)”
Perl slučitelné pravidelné výrazy (PCRE)
Perl má hodně bohatější syntax než vyrovnat prodloužené POSIX regexp. Tato syntax také byla použita v jiných pomůckách a aplikacích -- exim, například. Ačkoli ještě jmenoval “pravidelné výrazy”, Perl rozšíření dávají výraznou sílu, která daleko překoná pravidelné jazyky.
Tato zvláštní síla jde po ceně. Nejhorší-složitost případu lícování řetězec proti Perl pravidelnému výrazu je exponenciální na velikost vstupu. To znamená pravidelný výraz mohl dávat si na extrémně dlouhý čas k procesu dolů právě pravé stavy výrazu a vstup navlečou, ačkoli to zřídka se stane v praxi.
- Syntax a sémantika pravidelných výrazů Xeroxovým výzkumným centrem
- Regexp syntaktické shrnutí, stůl odkazu pro různé styly pravidelných výrazů
- Regexp konzultace napsaná Davidem Mertzem
- Regexp trenér, velmi silný interaktivní učící systém pilovat vaše regexp dovednosti.
- Zvládat pravidelné výrazy