• Cheat sheet na regulární výrazy. Praktický úvod do regulárních výrazů pro začátečníky

    Co jsou regulární výrazy?

    Pokud jste někdy museli pracovat s příkazový řádek, pravděpodobně jste použili masky souborů. Chcete-li například odstranit všechny soubory v aktuálním adresáři, které začínají písmenem "d", můžete zapisovat

    Regulární výrazy jsou podobný, ale mnohem výkonnější nástroj pro hledání řetězců, jejich porovnávání se vzorem a tak dále. Anglický název tohoto nástroje je Regulární výrazy nebo jednoduše RegExp. Přísně vzato, regulární výrazy jsou speciální jazyk k popisu vzorů strun.

    Implementace tohoto nástroje se liší v různé jazyky programování, i když ne moc. V tomto článku se zaměříme především na implementaci Perl Compatible Regular Expressions.

    Základy syntaxe

    Za prvé, stojí za zmínku, že jakýkoli řetězec sám o sobě je regulární výraz. Takže výraz

    Haha bude evidentně odpovídat řetězci "Haha" a jen to. Regulární výrazy rozlišují velká a malá písmena, takže řetězec "haha" (malá písmena) již nebude odpovídat výše uvedenému výrazu.

    Zde byste však měli být opatrní – jako každý jazyk mají i regulární výrazy speciální znaky, které je třeba escapovat. Zde je jejich seznam:

    . ^ $ * + ? ( ) \ | () . Provádí se stínění obvyklým způsobem- přidání \ před speciální znak.

    Sada znaků

    Předpokládejme, že chceme v textu najít všechna citoslovce označující smích. Prostě

    Haha nám nebude vyhovovat - přeci pod to nespadne "Hehe", "Hoho" a "Heehee". Jo a ten problém s případem prvního písmene je potřeba nějak vyřešit.

    Zde přijdou na pomoc množiny – místo specifikování konkrétního znaku si můžeme zapsat celý seznam a pokud je některý z uvedených znaků na určeném místě ve zkoumaném řetězci, bude řetězec považován za vhodný. Sady jsou psány v hranatých závorkách - vzor

    Bude odpovídat kterémukoli ze znaků "a", "b", "c" nebo "d".

    Vnitřní sada b Ó Většinu speciálních znaků není třeba escapovat, ale používat

    \ před nimi nebude považováno za chybu. Stále je nutné escapovat znaky „\“ a „^“ a nejlépe „]“ (takže znamená jakýkoli ze znaků „]“ nebo „[“, zatímco [x] je pouze posloupnost „[ X]"). Zdánlivě neobvyklé chování regulárních výrazů se znakem "]" je ve skutečnosti určeno známými pravidly, ale je mnohem jednodušší tomuto znaku jednoduše uniknout, než si je pamatovat. Navíc je potřeba escapovat znak "-", ten se používá k nastavení rozsahů (viz níže).

    Pokud hned po

    [ napište znak ^ , pak sada získá opačný význam - jakýkoli jiný znak než ty, které jsou uvedeny, bude považován za vhodný. Vzor [^xyz] tedy odpovídá libovolnému znaku, ve skutečnosti kromě "x", "y" nebo "z".

    Pokud tedy píšeme, použijeme tento nástroj na náš případ

    [Xx][aoie]x[aoie] , pak každý z řetězců "Haha", "hehe", "heehe" a dokonce "hoho" bude odpovídat vzoru.

    Předdefinované třídy postav

    Pro některé sady, které se používají poměrně často, existují speciální šablony. Tedy popsat jakékoliv znak mezery(mezera, tabulátor, zalomení řádku).

    \s , pro čísla - \d , pro latinské znaky, čísla a podtržítka "_" - \w .

    Pokud je vůbec nutné nějaký znak popsat, používá se k tomu tečka -

    Pokud jsou zadané třídy napsány s velkým písmenem (\S , \D , \W), změní svůj význam na opačný - jakýkoli znak bez mezer, jakýkoli znak, který není číslem, a jakýkoli znak jiný než latinka , čísla nebo podtržítka.

    Pomocí regulárních výrazů je také možné zkontrolovat polohu řádku vzhledem ke zbytku textu. Výraz

    \b označuje hranici slova, \B není hranice slova, ^ je začátek textu a $ je konec. Takže podle vzoru \bJava\b v řetězci "Java a JavaScript" budou první 4 znaky a podle vzoru \bJava\B - znaky od 10. do 13. (jako součást slova " JavaScript").

    Rozsahy

    Možná budete muset určit sadu, která obsahuje písmena, například od "b" do "f". Místo psaní

    [bvgdeziklmnoprostuf] můžete použít mechanismus rozsahu a napsat [b-f] . Vzor x tedy odpovídá řetězci "xA6", ale neodpovídá "xb9" (zaprvé kvůli tomu, že v rozsahu jsou uvedena pouze velká písmena, a zadruhé kvůli tomu, že 9 není zahrnuto v interval 0-8).

    Mechanismus rozsahu je zvláště důležitý pro ruský jazyk, protože pro něj neexistuje žádná podobná konstrukce

    \w K označení všech písmen ruské abecedy můžete použít vzor [а-яА-ЯёЁ] . Vezměte prosím na vědomí, že písmeno "ё" není zahrnuto v obecném rozsahu písmen a musí být uvedeno samostatně.

    Kvantifikátory (uvádějící počet opakování)

    Vraťme se k našemu příkladu. Co když má citoslovce „smějící se“ více než jednu samohlásku mezi x, například „Haahaaaa“? Naše stará pravidelná sezóna nám už nepomůže. Zde musíme použít kvantifikátory.

    Všimněte si, že kvantifikátor se vztahuje pouze na znak, který je před ním.

    Některé běžně používané konstrukce obdržely speciální označení v jazyce regulárních výrazů:

    S pomocí kvantifikátorů tedy můžeme vylepšit naši šablonu pro citoslovce

    [Xx][aoei]+x[aoei]* , a bude schopen rozpoznat řetězce "Haaha", "heeeeeeh" a "Hihii".

    Líná kvantifikace

    Předpokládejme, že stojíme před úkolem najít všechny HTML značky v řetězci

    tproger- můj zlatíčko moje stránky o programování!

    Jasné řešení

    <.*>zde nebude fungovat - najde celý řetězec, protože začíná značkou odstavce a končí jí. To znamená, že obsah značky bude považován za řetězec p> tproger- můj zlatíčko moje stránky o programování!

    Je to způsobeno tím, že standardně kvantifikátor pracuje podle tzv. chamtivý algoritmus - pokusí se vrátit nejdelší možný řetězec, který odpovídá podmínce. Problém lze vyřešit dvěma způsoby. První je použití výrazu

    <[^>]*> , což zabrání právu úhelník. Druhým je prohlásit kvantifikátor nikoli za chamtivý, ale líný. Dělá se to přidáním znaku napravo od kvantifikátoru? . Tito. pro vyhledání všech značek se výraz změní na<.*?> .

    Žárlivá kvantifikace

    Někdy můžete pro zvýšení rychlosti vyhledávání (zejména v případech, kdy řetězec neodpovídá regulárnímu výrazu) použít algoritmus, který zabrání tomu, aby se algoritmus vrátil k předchozím krokům vyhledávání, aby našel možné shody pro zbytek regulární výraz. To se nazývá žárlivý kvantifikace. Kvantifikátor je žárlivý přidáním symbolu napravo od něj

    Dalším využitím žárlivé kvantifikace je eliminace nežádoucích shod. Vzor ab*+a v řetězci „ababa“ tedy bude odpovídat pouze prvním třem znakům, ale nikoli znakům od třetího do pátého, protože znak "a", který je na třetí pozici, byl již použit pro první výsledek.

    Skupiny závorek

    Pro naši šablonu citoslovce „smějící se“ zbývá velmi málo – vzít v úvahu, že písmeno „x“ se může vyskytovat vícekrát, například „Hahahahaaahahoo“, nebo může dokonce končit písmenem „x“. Pravděpodobně by zde měl být použit kvantifikátor pro skupinu

    [aioe]+x, ale pokud napíšeme pouze [aioe]x+ , pak kvantifikátor + bude odkazovat pouze na znak "x", nikoli na celý výraz. Chcete-li to opravit, výraz musí být uzavřen v závorkách: ([aioe]x)+ .

    Takže náš výraz se stává

    [Xx]([aioe]x?)+ - nejprve přichází velké nebo malé písmeno "x" a poté libovolný nenulový počet samohlásek, které jsou (možná, ale ne nutně) proloženy jedním malým písmenem "x". Tento výraz však problém řeší jen částečně - pod tento výraz budou spadat i takové řádky jako např. "hihaheh" - někdo se tak může smát, ale předpoklad je velmi pochybný. Je zřejmé, že množinu všech samohlásek můžeme použít pouze jednou a pak se musíme nějak spolehnout na výsledek prvního hledání. Ale jak?…

    Uložení výsledku vyhledávání podle skupiny (zpětná vazba)

    Ukazuje se, že výsledek hledání skupiny závorek je zapsán do samostatného paměťového místa, ke kterému je dostupný přístup pro použití v následujících částech regulárního výrazu. Vrátíme-li se k úkolu najít HTML tagy na stránce, možná budeme muset nejen najít tagy, ale také zjistit jejich název. To nám může pomoci regulární výraz

    <(.*?)> .

    tproger- můj zlatíčko moje stránky o programování!

    Výsledek hledání pro všechny regulární výrazy: "

    », « », «», « », «», «

    ».
    Výsledek hledání pro první skupinu: "p", "b", "/b", "i", "/i", "/i", "/p".

    Na výsledek skupinového vyhledávání lze odkazovat pomocí výrazu

    \n , kde n je číslo od 1 do 9. Například výraz (\w)(\w)\1\2 odpovídá řetězcům "aaaa", "abab", ale neodpovídá "aabb".

    Pokud je výraz brán v závorkách pouze proto, aby se na něj použil kvantifikátor (neplánuje se zapamatovat si výsledek hledání pro tuto skupinu), pak by měla být okamžitě přidána první závorka

    ?: , například (?:+\w) .

    Pomocí tohoto mechanismu můžeme přepsat náš výraz do formuláře

    [Xx]([aoie])x?(?:\1x?)* .

    Výčet

    Chcete-li zkontrolovat, zda řetězec vyhovuje alespoň jednomu ze vzorů, můžete použít analog booleovského operátoru OR, který se zapisuje pomocí symbolu

    | . Vzor Anna|osamělost tedy obsahuje řetězce „Anna“ a „osamělost“. Obzvláště vhodné je použití výčtů uvnitř skupin závorek. Takže například (?:a|b|c|d) je zcela ekvivalentní (in tento případ druhá možnost je výhodnější kvůli výkonu a čitelnosti).

    S tímto operátorem můžeme k našemu regulárnímu výrazu citoslovce přidat schopnost rozpoznat smích jako "Ahahaah" - jediný úsměv, který začíná samohláskou:

    [Xx]([aoie])x?(?:\1x?)*|[Aa]x?(?:ah?)+

    Užitečné služby

    Svůj regulární výraz si můžete procvičit a/nebo otestovat na nějakém textu bez psaní kódu pomocí služeb jako RegExr, Regexpal nebo Regex101. Ten navíc poskytuje stručné vysvětlení toho, jak regulární výraz funguje.

    Jak funguje regulární výraz, který se vám dostal do rukou, můžete zjistit pomocí služby Regexper – dokáže vytvořit srozumitelné diagramy pro regulární výraz.

    RegExp Builder - vizuální konstruktor Funkce JavaScriptu pracovat s regulárními výrazy.

    0

    0

    Modifikátory

    Znak mínus (-), kterému předchází modifikátor (s výjimkou U), vytváří jeho negaci.

    Speciální znaky

    AnalogovýPopis
    () podvzor, ​​vnořený výraz
    divoká karta
    (a,b) počet výskytů od "a" do "b"
    | logické "nebo", v případě jednoznakových alternativ použijte
    \ unikání zvláštní postavy
    . libovolný znak kromě nového řádku
    \d desetinná číslice
    \D[^\d]jakýkoli znak jiný než desetinná číslice
    \F konec (konec) stránky
    \n překlad řádků
    \pL Písmeno zakódované v UTF-8 při použití modifikátoru u
    \r návrat vozíku
    \s[\t\v\r\n\f]vesmírný charakter
    \S[^\s]jakákoli postava kromě promelu
    \t zarážka tabulátoru
    \w libovolné číslo, písmeno nebo podtržítko
    \W[^\w]jakýkoli znak jiný než číslo, písmeno nebo podtržítko
    \proti vertikální záložka

    Speciální znaky uvnitř třídy znaků

    Umístění v řetězci

    PříkladKorespondencePopis
    ^ ^aAááááázačátek řádku
    $ $ááááá A konec čáry
    \A\AaAááááá
    aaa aaa
    začátek textu
    \za\zaaa aaa
    ááááá A
    konec textu
    \ba\b
    \ba
    aa A aa A
    A aa A aa
    hranice slova, tvrzení: předchozí znak je slovo, ale následující ne, nebo naopak
    \B\Ba\BA A a a A Ažádná hranice slova
    \G\Gaaaa aaaPředchozí úspěšné hledání, hledání se zastavilo na pozici 4 – kde a nebylo nalezeno
    Stáhnout ve formátu PDF, PNG.

    Kotvy

    Kotvy v regulárních výrazech označují začátek nebo konec něčeho. Například řádky nebo slova. Jsou reprezentovány určitými symboly. Vzor odpovídající řetězci, který začíná číslem, by například vypadal takto:

    Zde znak ^ označuje začátek řádku. Bez něj by vzor odpovídal jakémukoli řetězci obsahujícímu číslici.

    Třídy postav

    Třídy znaků v regulárních výrazech odpovídají najednou určité sadě znaků. Například \d odpovídá jakékoli číslici od 0 do 9 včetně, \w odpovídá písmenům a číslům a \W odpovídá všem znakům kromě písmen a číslic. Vzor označující písmena, čísla a mezery vypadá takto:

    POSIX

    POSIX je relativně nový přírůstek do rodiny regulárních výrazů. Myšlenka, stejně jako u tříd znaků, spočívá v použití zkratek, které představují nějakou skupinu znaků.

    Výpisy

    Zpočátku má téměř každý problém porozumět výrokům, ale jak se v nich více seznámíte, budete je používat poměrně často. Tvrzení poskytují způsob, jak říci: „Chci v tomto dokumentu najít každé slovo, které obsahuje písmeno 'q', za kterým nenásleduje 'werty'“.

    [^\s]*q(?!werty)[^\s]*

    Výše uvedený kód začíná hledáním jakýchkoli jiných znaků než mezery ([^\s]*) následované q . Analyzátor pak dosáhne příkazu "vpřed". Tím se předchozí prvek (znak, skupina nebo třída znaků) automaticky stane podmíněným – bude se vzoru shodovat pouze v případě, že je tvrzení pravdivé. V našem případě je výrok záporný (?!), tj. bude pravdivý, pokud nebude nalezeno to, co hledá.

    Analyzátor tedy zkontroluje několik dalších znaků podle navrženého vzoru (werty). Pokud jsou nalezeny, pak je výrok nepravdivý, což znamená, že znak q bude "ignorován", to znamená, že nebude odpovídat vzoru. Pokud werty není nalezen, pak je tvrzení pravdivé a s q je vše v pořádku. Poté pokračuje v hledání jakýchkoli jiných znaků než mezery ([^\s]*).

    kvantifikátory

    Kvantifikátory umožňují definovat část vzoru, která se musí opakovat vícekrát za sebou. Pokud například chcete zjistit, zda dokument obsahuje řetězec 10 až 20 (včetně) písmen „a“, můžete použít tento vzor:

    A(10;20)

    Ve výchozím nastavení jsou kvantifikátory chamtivé. Proto bude kvantifikátor + , což znamená „jednou nebo vícekrát“, odpovídat maximální možné hodnotě. Někdy to způsobuje problémy a pak můžete pomocí speciálního modifikátoru říct kvantifikátoru, aby přestal být chamtivý (stal se „líným“). Podívejte se na tento kód:

    ".*"

    Tento vzor odpovídá textu uzavřenému ve dvojitých uvozovkách. Váš původní řádek však může být něco takového:

    Ahoj světe

    Výše uvedená šablona najde v tomto řetězci následující podřetězec:

    "helloworld.htm" title="Ahoj světe" !}

    Byl příliš chamtivý, zachytil ten největší kus textu, jaký mohl.

    ".*?"

    Tento vzor také odpovídá všem znakům uzavřeným v uvozovkách. Ale líná verze (všimnete si modifikátoru?) hledá nejmenší možný výskyt, a proto najde každý podřetězec v dvojitých uvozovkách samostatně:

    "helloworld.htm" "Ahoj světe"

    Escape v regulárních výrazech

    Regulární výrazy používají některé znaky k reprezentaci různých částí vzoru. Problém však nastává, pokud potřebujete najít jeden z těchto znaků v řetězci jako běžný znak. Tečka například v regulárním výrazu znamená „jakýkoli znak kromě zalomení řádku“. Pokud potřebujete najít tečku v řetězci, nemůžete jednoduše použít " . » jako zástupný znak – tím se najde téměř vše. Musíte tedy analyzátoru sdělit, že s touto tečkou by se mělo zacházet jako s běžnou tečkou a ne za „jakýkoli znak“. To se provádí pomocí únikové postavy.

    Znak escape před znakem, jako je tečka, způsobí, že analyzátor ignoruje jeho funkci a bude s ním pracovat jako s normálním znakem. Existuje několik znaků, které takové escapování vyžadují ve většině šablon a jazyků. Najdete je v pravém dolním rohu cheat sheet ("Meta Symboly").

    Šablona pro nalezení bodu je:

    \.

    Jiné speciální znaky v regulárních výrazech odpovídají neobvyklým prvkům v textu. Například zalomení řádků a tabulátory lze psát z klávesnice, ale pravděpodobně to zmást programovací jazyky. Znak escape se zde používá k tomu, aby sdělil analyzátoru, aby s dalším znakem zacházel jako se speciálním znakem a ne jako s normálním písmenem nebo číslem.

    Escape znaky v regulárních výrazech

    Substituce řetězce

    Substituce řetězců je podrobně popsána v další části "Skupiny a rozsahy", ale zde by měla být zmíněna existence "pasivních" skupin. Toto jsou skupiny, které jsou při nahrazování ignorovány, což je velmi užitečné, pokud chcete v šabloně použít podmínku „nebo“, ale nechcete, aby se tato skupina účastnila suplování.

    Skupiny a rozsahy

    Skupiny a rozsahy jsou velmi, velmi užitečné. Je asi jednodušší začít s rozsahy. Umožňují určit sadu vhodných znaků. Chcete-li například zkontrolovat, zda řetězec obsahuje hexadecimální číslice(0 až 9 a A až F), měl by být použit následující rozsah:

    Chcete-li otestovat opak, použijte záporný rozsah, který v našem případě odpovídá libovolnému znaku kromě čísel od 0 do 9 a písmen od A do F:

    [^A-Fa-f0-9]

    Skupiny se nejčastěji používají, když je v šabloně potřeba podmínka „nebo“; když potřebujete odkazovat na část šablony z jiné její části; stejně jako při nahrazování strun.

    Použití „nebo“ je velmi jednoduché: následující vzor hledá „ab“ nebo „bc“:

    Pokud potřebujete odkazovat na některou z předchozích skupin v regulárním výrazu, měli byste použít \n , kde místo n nahraďte číslo požadovaná skupina. Možná budete chtít vzor, ​​který odpovídá písmenům „aaa“ nebo „bbb“, za kterými následuje číslo a poté stejná tři písmena. Tento vzor je implementován pomocí skupin:

    (aaa|bbb)+\1

    První část vzoru hledá „aaa“ nebo „bbb“ a slučuje nalezená písmena do skupiny. Následuje hledání jedné nebo více číslic (+) a nakonec \1 . Poslední část šablony odkazuje na první skupinu a hledá stejnou. Hledá shodu s textem již nalezeným v první části vzoru, spíše než aby se shodoval. Takže "aaa123bbb" nebude odpovídat vzoru výše, protože \1 bude hledat "aaa" za číslem.

    Jeden z nejvíce užitečné nástroje v regulárních výrazech je substituce řetězců. Při nahrazování textu se můžete na nalezenou skupinu odkazovat pomocí $n . Řekněme, že chcete, aby byla všechna slova „přání“ v textu tučně. Chcete-li to provést, měli byste použít funkci nahrazení regulárního výrazu, která může vypadat takto:

    Nahradit (vzor, ​​nahrazení, předmět)

    První parametr bude vypadat nějak takto (pro tuto konkrétní funkci možná budete potřebovat několik znaků navíc):

    ([^A-Za-z0-9])(přání)([^A-Za-z0-9])

    Najde jakýkoli výskyt slova „přání“ spolu s předchozími a následujícími znaky, pokud to nejsou písmena nebo čísla. Pak by vaše substituce mohla vypadat takto:

    $1$2$3

    Nahradí celý řetězec nalezený vzorem. Nahrazování začneme od prvního nalezeného znaku (to není písmeno ani číslo) a označíme jej $1 . Bez něj bychom tento znak z textu jednoduše odstranili. Totéž platí pro konec substituce (3 $). Uprostřed jsme přidali HTML tag pro tučné písmo (samozřejmě můžete místo toho použít CSS nebo ), zvýrazněním druhé skupiny nalezené vzorem ($2).

    Zde je několik příkladů regulárních výrazů.

      karova - zjevně šablona, ​​pro kterou se slovo karova hodí;

      \b(shift|unshift|pop|push|splice)\b - libovolné z uvedených slov;

      ^\s+ - jedna nebo více mezer nebo tabulátorů na začátku řádku.

    V regulárních výrazech alfanumerické znaky obvykle stojí samy za sebe. Například vzor Hello říká, že se má hledat znak H následovaný e , pak l a tak dále.

    Pokud je obtížné nebo nepohodlné zadat znak doslovně, můžete použít nám již známé literály: \n , \t a další. To znamená, že znak \ v regulárním výrazu již nemůže stát sám za sebe, protože mění význam znaku, který za ním následuje: zejména písmeno n spolu s předchozím zpětným lomítkem označuje znak konce řádku . Pokud chcete do vzoru zahrnout znak \ jako takový, musíte použít doslovný \\ .

    Existují další symboly, které ve vzorech nabývají zvláštního významu, místo aby reprezentovaly samy sebe. Takové postavy se nazývají metaznaky. Zde je několik příkladů metaznaků bez uvedení jejich speciálního významu (seznam není vyčerpávající): \.-()()?*+^$| .

    Některé postavy nejsou vždy metaznaky, ale pouze tehdy, když spadají do určitého kontextu. Některé metaznaky mají různý význam v závislosti na kontextu.

    Pokud chcete do regulárního výrazu vložit metaznak a zbavit jej tak zvláštního významu, měli byste jej chránit ( štít) tak, že před něj vložíte zpětné lomítko. Například znaménko plus v regulárním výrazu se vloží jako \+ .

    Vzor označuje jeden ze znaků uvedených v hranatých závorkách. Pokud nás například zajímá slovo Hello , ať už je to velké nebo malé písmeno, vzor by byl: ello . Zde je šablona pro malou samohlásku v anglické abecedě: . Dalším příkladem je třída znaků sestávající z obou hranaté závorky: [\[\]] .

    Pokud třída znaků obsahuje v kódové tabulce po sobě jdoucí znaky, stačí určit první a poslední znak vložením pomlčky mezi ně. Například třída označující libovolnou desetinnou číslici může být uvedena jako . Písmeno anglické abecedy se označuje jako (zde spoléháme na to, že v jakékoli kódové tabulce velké a malé Anglická písmena jít v souvislých blocích abecední pořadí; blok malých písmen však bezprostředně nenavazuje na blok velkých písmen).

    Je možné definovat třídu znaků skládající se ze všech znaků kromě uvedených - tzv negace třídy postavy. Za tímto účelem se bezprostředně za úvodní hranatou závorku před výčtem vloží cirkumflex ^. Jakýkoli znak, který není číslicí, může být reprezentován jako [^0-9] .

    Pro některé oblíbené třídy postav existují speciální zápisy:

    Když je řetězec úspěšně spárován s regulárním výrazem, každý znak nebo třída znaků ve vzoru odpovídá znaku v řetězci. Existují však konstrukce, které neoznačují přítomnost určitého znaku, ale určité (prázdné) místo v řetězci. Takové struktury se nazývají vazbynebo kotvy

    Nejčastěji používané kotvy jsou kotvy na začátku (^) a na konci ($) řetězce. Kotva na začátek provázku musí být umístěna na začátku vzoru a kotva na konec musí být umístěna na konci.

    Například ruská slova jako protijed, antisemitismus nebo antičástice odpovídají vzoru ^anti. Bez vazby by se vešly i řádky, které nezačínají „anti-“, ale uvnitř obsahují tuto kombinaci písmen, například merkantilismus. Pro hledání slov končících na "-tsya" potřebujete šablonu tsya $ (jsme si téměř 100% jisti, že všechna taková slova jsou zvratná slovesa v infinitivu). Nic vám nebrání v použití obou těchto vazeb v šabloně.

    Další užitečnou kotvou je kotva k hranici mezi slovy \b . Odpovídá umístění v řetězci, které je mezi znaky, z nichž jeden je \w a druhý \W (v libovolném pořadí). Tato kotva může také odpovídat začátku nebo konci řetězce (v tomto případě se má za to, že výraz je obklopen imaginárními znaky ze třídy \W).

    Pokud hledáme fragment, který se musí shodovat s jedním z několika vzorů, musíme tyto vzory vypsat a oddělit je svislou čárou | . Například pondělí|úterý|středa|čtvrtek|pátek|sobota|neděle. Aby se seznam alternativ stal samostatnou jednotkou a oddělil jej od sousedních, musí být uzavřen v závorkách. Například vzor Respect(th|aya) znamená řetězec Respekt následovaný jedním z řetězců й nebo а. Bez závorek by vzor Dear|aya označoval jeden z řetězců Dear nebo aya. Závorky mají důležitý vedlejší účinek, o kterém bude řeč v části Seskupování a zachycení.

    Aby bylo možné uvést, kolikrát lze vzor opakovat, tzv kvantifikátory(z latinského slova kvantová-Kolik):

    Kvantifikátory * , + a? jsou nadbytečné, protože mohou být vyjádřeny odlišně pomocí složených závorek. Totiž, * je ekvivalentní (0,) , + je ekvivalentní (1,) , co? je stejný jako (0,1). Ale tyto kvantifikátory se velmi často používají a to si zaslouží samostatné označení.

    Pokud je vzor, ​​na který je kvantifikátor aplikován, něco složitějšího než jen jeden znak nebo třída znaků, musí být uzavřen v závorkách.

    Zde jsou nějaké příklady:

      ^\d+$ - sekvence jedné nebo více desetinných číslic (vzor pro nezáporná celá čísla v desítkové soustavě);

      ^\-?\d+$ - totéž, ale pro všechna (možná záporná) celá čísla;

      ^\-?(\d+(\.\d*)?|\.\d+)$ - šablona pro reálná čísla;

    Podívejme se blíže na poslední příklad. Kromě volitelného mínus na začátku vzor obsahuje skupinu se dvěma alternativami: \d+(\.\d*)? a \.\d+ . Obsahuje první alternativa povinnou celočíselnou část \d+ (alespoň jedna číslice) následovanou volitelnou zlomkovou částí (\.\d*)? . Zlomková část, pokud existuje, má desetinnou čárku a možná i nějaké číslice. Řádky 15, 15, 15.487 tedy odpovídají této alternativě. Další alternativa je nutná pro řetězce ve tvaru .618 s chybějící celočíselnou částí - v mnoha počítačových jazycích má tento zápis právo existovat.

    Pokud jsou nejjednodušší prvky regulárního výrazu - znaky, třídy znaků a kotvy - zapsány v řadě, znamená to, že při hledání vzoru v řetězci budou tyto prvky porovnávány s částmi řetězce postupně, ve stejném pořadí. . Tento příkaz je porušen, pokud jsou použity alternativy. Můžete si představit, že složený regulární výraz je vytvořen z těch nejjednodušších pomocí dvou operací: zřetězení ( kompozice) a alternativy. Skládání je obdobou operace násobení v aritmetice. Alternativa je analogická sčítání. První podobnost s aritmetikou spočívá v tom, že alternativní operátor má nižší prioritu než složení, takže pro seskupování mohou být vyžadovány závorky, jako v Respekt .

    Poznámka

    Mnoho, i když ne všechny, aritmetické zákony platí také pro regulární výrazy:

    komutativnost alternativy x | y=y | X; alternativní asociativita x | y | z=x | y | z kompoziční asociativnost x y z = x y z; distributivita alternativy s ohledem na složení (vlevo a vpravo) x y | z = x y | x z , x | yz = xz | y z .

    V této podivné aritmetice regulárních výrazů neplatí zákon komutativnosti pro složení. Navíc neexistuje žádná analogie nuly kvůli zřejmému vztahu x | x = x. Roli jednotky (pravá a levá) pro skladbu plní prázdná šablona(označujeme 𝟙): 𝟙 ⁣ x = x ⁣ 𝟙 = x . Kvantifikátory tvaru ( n ) hrají roli zvýšení na n-tou mocninu.

    Kromě funkce seskupování plní závorky funkci zachycení. Hlavním výsledkem porovnávání řetězce se vzorem je odpověď na otázku: Odpovídá řetězec vzoru? Kromě toho je však často nutné určit, který fragment nebo fragmenty řetězce vytvořily určité fragmenty v regulárním výrazu.

    Nebo možná kyselina ethylendiamin-N N N ′ N ′ -tetraoctová?

    Zvažte příklad, ve kterém jsou v textu odkazy na různé kyseliny. Naše školní vzpomínky z chemie nás přivedly na myšlenku, že názvy kyselin končí buď na vai, nebo na naya, nebo na tay, a po mezerě pak následuje slovo kyselina. Vytvoříme šablonu: \S+[vnt]-tá kyselina. Spojte text se šablonou. Štěstí! Člověk si ale klade otázku, jaký druh kyseliny byl v textu zmíněn? Sůl? Kamzík? Dusík? Plavíková? Chlorik? Chlór? Chlorný? Citrón? Pruské? Deoxyribonukleová?

    Zde se hodí zachycení. Část šablony, která by podle našeho plánu měla odpovídat názvu, uzavřeme do závorek: (\S+[int]th) kyselina. Poté, co stroj našel zmínku o kyselině v textu, uloží své jméno (což odpovídá fragmentu šablony uzavřenému v závorkách) do speciální proměnné - zachycovací vyrovnávací paměť

    Regulární výraz může obsahovat více skupin zachycení. Takové skupiny na sebe mohou nejen navazovat, ale i hnízdit jedna do druhé. Jinými slovy, regulární výraz musí být vyvážen proti závorkám ve stejném smyslu, jak je popsáno v kapitole 23. Kontrola vyvážení závorek“ (samozřejmě to platí pouze pro závorky, které slouží k seskupování a zachycení; závorky, před kterými je zpětné lomítko, nemají vliv na vyvážení skupiny). Pokud je hledání úspěšné, každá skupina zachytí nějakou část textu: první - v první vyrovnávací paměti, druhá - ve druhé a tak dále. Jak se číslují skupiny, když jsou vnořeny do sebe? Číslování je v pořadí, v jakém se objevují úvodní závorky:

    2 4 5 ┝┑ ┝┑┝┑ (()(()())) │ ┝━━━━┙│ │ 3 │ ┝━━━━━━━━┙ 1

    V případě potřeby lze skupinu z číslování vyloučit, to znamená zbavit ji funkce „zachycení“ a ponechat pouze funkci seskupování. K tomu místo oddělovačů skupiny (⋯) používáme ( ?: ⋯). Tady je otazník Ne označuje kvantifikátor, protože kvantifikátoru musí předcházet buď znak, třída znaků nebo skupina.

    Použití číslovaných skupin zachycení není vždy vhodné, zejména ve velkých regulárních výrazech. Vše, co musíte udělat, je vložit do šablony. nová skupina zachytit, jak se číslování ztratí. Poté budete muset provést opravy na všech místech v programu, kde se k vyrovnávací paměti pro zachycení přistupuje pomocí čísel. Ke skupině však můžete přiřadit jméno, které vám umožní odkazovat na odpovídající vyrovnávací paměť tímto názvem. Oddělovače se používají k vytvoření pojmenované skupiny ( ? ⋯) , kde je místo názvu nahrazeno požadované jméno.

    Části řetězce zachycené v bufferech lze použít dvěma způsoby. Za prvé, program, který používá k vyhledávání nebo nahrazování regulární výraz, může přistupovat k vyrovnávací paměti jako ke speciálním proměnným. Toto použití bude probráno v části Najít a nahradit operátory. Druhou možností je použití skupinových odkazů přímo v regulárním výrazu, viz sekce "Zpětné odkazy".

    Zvažte problém hledání slov obsahujících tři stejné samohlásky za sebou. Naivní řešení [aeeyoueyuya](3) pomocí kvantifikátorů nebude fungovat, protože tento vzor odpovídá řetězcům se třemi po sobě jdoucími samohláskami, ale nemusí být nutně stejný. Obludné rozhodnutí s úplným seznamem alternativ, aaa | eee | eee | eee | ooo | uuu | uh | yuuyu | yay, rozhořčeně odmítáme: koneckonců stojí za to vzít jinou, rozsáhlejší třídu znaků nebo nahradit trojku v kvantifikátoru s větší hodnotou, jako je velikost šablony, poroste katastrofálně.

    Je však možné elegantní řešení pomocí zachytávacích skupin. Zachyťme samohlásku ve skupině a pak se podívejme na obsah vyrovnávací paměti pro zachycení. Odkazy na první, druhý a třetí buffer jsou zapsány v regulárním výrazu jako \g1 , \g2 , \g3 . Řešením tedy bude vzor ([aeeyoueya])\g1(2) . Všimněte si, že odkaz na vyrovnávací paměť pro zachycení musí následovat po odpovídající skupině v regulárním výrazu.

    Zpětné odkazy mohou odkazovat nejen na číslované vyrovnávací paměti, ale také na pojmenované. Takové odkazy mají tvar \k , kde je opět místo jména konkrétní jméno. Náš příklad lze přepsat pomocí pojmenovaných skupin: (? [aeeyoueyuya])\k {2} (samohláska- samohláska).

    Někdy je potřeba vyhledávání, které nerozlišuje malá a velká písmena. Takovému hledání se říká nerozlišuje malá a velká písmena (citlivý na velká písmena). Namísto nahrazování písmen všude v šabloně třídami se dvěma písmeny (a → , b → , …), stačí šablonu uzavřít do speciální skupina, který zahrnuje režim vyhledávání bez rozlišení velkých a malých písmen: (? já:⋯). Taková skupina není záchytnou skupinou. Pokud má být vyhledávání bez rozlišení malých a velkých písmen implementováno pouze na části regulárního výrazu, měla by být do skupiny umístěna pouze požadovaná část.

    Naopak, pokud některá část regulárního výrazu, ve kterém se provádí vyhledávání bez rozlišení malých a velkých písmen, potřebuje tento režim vypnout, můžete se vrátit k obvyklému vyhledávání rozlišující malá a velká písmena pomocí skupiny ( ?-i: ⋯) .

    Režimy rozlišující malá a velká písmena ovlivňují pouze písmena. Co se počítá jako písmeno a co ne, je specifické pro daný jazyk, stejně jako pravidla shody mezi velkými a malými písmeny. Z hlediska angličtiny například symbol Щ není písmeno, v němčině je písmeno ß (mimochodem, velká verze tohoto písmene se skládá ze dvou písmen SS: Carl Friedrich Gauß → CARL FRIEDRICH GAUSS).

    Cheat sheet je obecný průvodce vzory regulárních výrazů bez ohledu na specifika jakéhokoli jazyka. Je prezentována ve formě tabulky, která se vejde na jeden potištěný list A4. Vytvořeno pod licencí Creative Commons na základě cheat sheet od Dave Childa ().

    Pamatuj si to různé jazyky programovací jazyky podporují regulární výrazy v různé míře, takže se můžete dostat do situace, kdy některé z těchto funkcí nebudou fungovat. Pro ty, kteří se s regulárními výrazy teprve seznamují, se nabízí tento překlad autorových komentářů k cheat sheetu. Seznámí vás s některými technikami používanými při vytváření vzorů regulárních výrazů.

    Kotvy v regulárních výrazech označují začátek nebo konec něčeho. Například řádky nebo slova. Jsou reprezentovány určitými symboly. Vzor odpovídající řetězci, který začíná číslem, by například vypadal takto:

    Zde znak ^ označuje začátek řádku. Bez něj by vzor odpovídal jakémukoli řetězci obsahujícímu číslici.

    Třídy znaků v regulárních výrazech odpovídají najednou určité sadě znaků. Například \d odpovídá jakékoli číslici od 0 do 9 včetně, \w odpovídá písmenům a číslům a \W odpovídá všem znakům kromě písmen a číslic. Vzor označující písmena, čísla a mezery vypadá takto:

    POSIX

    POSIX je relativně nový přírůstek do rodiny regulárních výrazů. Myšlenka, stejně jako u tříd znaků, spočívá v použití zkratek, které představují nějakou skupinu znaků.

    Zpočátku má téměř každý problém porozumět výrokům, ale jak se v nich více seznámíte, budete je používat poměrně často. Tvrzení poskytují způsob, jak říci: „Chci v tomto dokumentu najít každé slovo, které obsahuje písmeno 'q', za kterým nenásleduje 'werty'“.

    [^\s]*q(?!werty)[^\s]*

    Výše uvedený kód začíná hledáním jakýchkoli jiných znaků než mezery ([^\s]*) následované q . Analyzátor pak dosáhne příkazu "vpřed". Tím se předchozí prvek (znak, skupina nebo třída znaků) automaticky stane podmíněným – bude se vzoru shodovat pouze v případě, že je tvrzení pravdivé. V našem případě je výrok záporný (?!), tj. bude pravdivý, pokud nebude nalezeno to, co hledá.

    Analyzátor tedy zkontroluje několik dalších znaků podle navrženého vzoru (werty). Pokud jsou nalezeny, pak je výrok nepravdivý, což znamená, že znak q bude "ignorován", to znamená, že nebude odpovídat vzoru. Pokud werty není nalezen, pak je tvrzení pravdivé a s q je vše v pořádku. Poté pokračuje v hledání jakýchkoli jiných znaků než mezery ([^\s]*).

    Tato skupina obsahuje vzorové šablony. S jejich pomocí můžete vidět, jak lze regulární výrazy používat v každodenní praxi. Všimněte si však, že nebudou nutně fungovat v žádném programovacím jazyce, protože každý z nich ano individuální vlastnosti A různé úrovně podpora regulárních výrazů.

    Kvantifikátory umožňují definovat část vzoru, která se musí opakovat vícekrát za sebou. Pokud například chcete zjistit, zda dokument obsahuje řetězec 10 až 20 (včetně) písmen „a“, můžete použít tento vzor:

    A(10;20)

    Ve výchozím nastavení jsou kvantifikátory chamtivé. Proto bude kvantifikátor + , což znamená „jednou nebo vícekrát“, odpovídat maximální možné hodnotě. Někdy to způsobuje problémy a pak můžete pomocí speciálního modifikátoru říct kvantifikátoru, aby přestal být chamtivý (stal se „líným“). Podívejte se na tento kód:

    ".*"

    Tento vzor odpovídá textu uzavřenému ve dvojitých uvozovkách. Váš původní řádek však může být něco takového:

    Ahoj světe

    Výše uvedená šablona najde v tomto řetězci následující podřetězec:

    "helloworld.htm" title="Ahoj světe" !}

    Byl příliš chamtivý, zachytil ten největší kus textu, jaký mohl.

    ".*?"

    Tento vzor také odpovídá všem znakům uzavřeným v uvozovkách. Ale líná verze (všimnete si modifikátoru?) hledá nejmenší možný výskyt, a proto najde každý podřetězec v dvojitých uvozovkách samostatně:

    "helloworld.htm" "Ahoj světe"

    Regulární výrazy používají některé znaky k reprezentaci různých částí vzoru. Problém však nastává, pokud potřebujete najít jeden z těchto znaků v řetězci jako běžný znak. Tečka například v regulárním výrazu znamená „jakýkoli znak kromě zalomení řádku“. Pokud potřebujete najít tečku v řetězci, nemůžete jednoduše použít " . » jako zástupný znak – tím se najde téměř vše. Musíte tedy analyzátoru sdělit, že s touto tečkou by se mělo zacházet jako s běžnou tečkou a ne za „jakýkoli znak“. To se provádí pomocí únikové postavy.

    Znak escape před znakem, jako je tečka, způsobí, že analyzátor ignoruje jeho funkci a bude s ním pracovat jako s normálním znakem. Existuje několik znaků, které takové escapování vyžadují ve většině šablon a jazyků. Najdete je v pravém dolním rohu cheat sheet ("Meta Symboly").

    Šablona pro nalezení bodu je:

    \.

    Jiné speciální znaky v regulárních výrazech odpovídají neobvyklým prvkům v textu. Například zalomení řádků a tabulátory lze psát z klávesnice, ale pravděpodobně to zmást programovací jazyky. Znak escape se zde používá k tomu, aby sdělil analyzátoru, aby s dalším znakem zacházel jako se speciálním znakem a ne jako s normálním písmenem nebo číslem.

    Substituce řetězců je podrobně popsána v další části "Skupiny a rozsahy", ale zde by měla být zmíněna existence "pasivních" skupin. Toto jsou skupiny, které jsou při nahrazování ignorovány, což je velmi užitečné, pokud chcete v šabloně použít podmínku „nebo“, ale nechcete, aby se tato skupina účastnila suplování.

    Skupiny a rozsahy jsou velmi, velmi užitečné. Je asi jednodušší začít s rozsahy. Umožňují určit sadu vhodných znaků. Chcete-li například zkontrolovat, zda řetězec obsahuje hexadecimální číslice (0 až 9 a A až F), použijte následující rozsah:

    Chcete-li otestovat opak, použijte záporný rozsah, který v našem případě odpovídá libovolnému znaku kromě čísel od 0 do 9 a písmen od A do F:

    [^A-Fa-f0-9]

    Skupiny se nejčastěji používají, když je v šabloně potřeba podmínka „nebo“; když potřebujete odkazovat na část šablony z jiné její části; stejně jako při nahrazování strun.

    Použití „nebo“ je velmi jednoduché: následující vzor hledá „ab“ nebo „bc“:

    Pokud potřebujete odkazovat na některou z předchozích skupin v regulárním výrazu, měli byste použít \n , kde místo n nahraďte číslo požadované skupiny. Možná budete chtít vzor, ​​který odpovídá písmenům „aaa“ nebo „bbb“, za kterými následuje číslo a poté stejná tři písmena. Tento vzor je implementován pomocí skupin:

    (aaa|bbb)+\1

    První část vzoru hledá „aaa“ nebo „bbb“ a slučuje nalezená písmena do skupiny. Následuje hledání jedné nebo více číslic (+) a nakonec \1 . Poslední část šablony odkazuje na první skupinu a hledá stejnou. Hledá shodu s textem již nalezeným v první části vzoru, spíše než aby se shodoval. Takže "aaa123bbb" nebude odpovídat vzoru výše, protože \1 bude hledat "aaa" za číslem.

    Jedním z nejužitečnějších nástrojů v regulárních výrazech je substituce řetězců. Při nahrazování textu se můžete na nalezenou skupinu odkazovat pomocí $n . Řekněme, že chcete, aby byla všechna slova „přání“ v textu tučně. Chcete-li to provést, měli byste použít funkci nahrazení regulárního výrazu, která může vypadat takto:

    Nahradit (vzor, ​​nahrazení, předmět)

    První parametr bude vypadat nějak takto (pro tuto konkrétní funkci možná budete potřebovat několik znaků navíc):

    ([^A-Za-z0-9])(přání)([^A-Za-z0-9])

    Najde jakýkoli výskyt slova „přání“ spolu s předchozími a následujícími znaky, pokud to nejsou písmena nebo čísla. Pak by vaše substituce mohla vypadat takto:

    $1$2$3

    Nahradí celý řetězec nalezený vzorem. Nahrazování začneme od prvního nalezeného znaku (to není písmeno ani číslo) a označíme jej $1 . Bez něj bychom tento znak z textu jednoduše odstranili. Totéž platí pro konec substituce (3 $). Uprostřed jsme přidali HTML tag pro tučný text (samozřejmě místo něj můžete použít CSS popř ), zvýrazněním druhé skupiny nalezené vzorem ($2).

    Modifikátory šablon se používají v několika jazycích, zejména v Perlu. Umožňují vám změnit způsob, jakým analyzátor funguje. Například modifikátor i způsobí, že analyzátor bude ignorovat velká a malá písmena.

    Regulární výrazy v Perlu jsou orámovány stejným znakem na začátku a na konci. Může to být jakýkoli znak (obvykleji "/") a vypadá takto:

    /vzor/

    Modifikátory se přidávají na konec tohoto řádku takto:

    /vzor/i

    Konečně poslední část tabulky obsahuje meta znaky. Jedná se o znaky, které mají v regulárních výrazech zvláštní význam. Pokud tedy chcete jednu z nich použít jako běžnou postavu, pak je třeba ji escapovat. Pro kontrolu přítomnosti závorek v textu se používá následující vzor:

    Opravdu děkuji. hlavně pro upřesnění. Nemáš zač :) děkuji moc. Děkuji mnohokrát! Děkuji Super seriál... mimochodem, překládám tento seriál z angličtiny (a dělám to ve formátu HTML), můžete si ho prohlédnout na mém webu: sitemaker.x10.bz. Existuje také cheat sheet pro HTML, který zde není. Děkuji. A co takhle odstranit prvních 10 znaků libovolného a pak tam bude nějaký text se znaky a pak z určitého znaku bude nutné odstranit vše až do konce. !? 2 lails: Regulární výrazy zde nejsou potřeba. Substr() a strpos() vám pomohou, pokud jde o PHP nebo jejich protějšky v jiných jazycích. Bylo zajímavé číst o prohlášeních, začínám tomu trochu rozumět. Takhle to bude přehlednější: http://pcreonline.com/OazZNu/ Dobrý den. Můžete mi prosím říct, proč mi ve FireFoxu nefungují "looking backward statement"? Nápověda RegExp od Mozilly je vůbec nemá, je to ve Foxu opravdu nemožné? =((( Dobré ráno, zpětná tvrzení nejsou podporována JavaScriptem, takže pravděpodobně nebudou fungovat ani v jiných prohlížečích. Existuje více detailní informace o omezeních regulárních výrazů v jazyce JavaScript. Výborně! pojď pět! Děkuji! Stručně a jasně! Hm. Díky, díky! díky, moc to pomohlo, díky moc! Děkuji za článek! Řekněte mi, pokud potřebujete omezit zadávání hesla na čísla a nezadávat více než 5 písmen? Dobrý den, cheat sheet je dobrý pro všechny, ale šlo by zebru zesvětlit, protože když tisknete černá písmena tmavé pozadí ne moc děkuji. Malá otázka, musíte najít hodnoty mezi start= a &, ale zároveň vyloučit tyto hranice rozsahu z výstupu. Jak najít rozsah udělal: start=.(1,)&
    Stále však není dostatek znalostí o tom, jak odstranit hranice. Budu vděčný za pomoc. Můžete mi prosím říct, jak nastavit regulární výraz ke kontrole (může nebo nemusí být shoda)? Jak správně napsat regulární výraz začíná rovnítkem, najde uvnitř jakýkoli text a zastaví se u znaménka &
    Tyto znaky nejsou zahrnuty do vyhledávání, začínají a končí požadovanou částí řetězce...

    Píšu několika způsoby, ale ve výsledku buď veškerý text zůstane, ale znaménka = a & zmizí
    Nebo nechte & na konci řádku...
    Četl jsem o dolaru, že neodstraní znak na konci řádku

    malý příklad

    varreg = /[^=]*[^&]/g
    str.match(reg);

    Logicky začínáme rovnítkem a hledáme libovolný text /[^=]*
    pak se zastavíme u znaku & [^&], aniž bychom jej zahrnuli do hledání a opakujeme hledání déle, dokud ho úplně neobejdeme /g

    Nefunguje... Vrátí celý řetězec

    Dobrý večer, řekněte mi, jak najít číslo, které je menší než 20? Díky kluci, díky za článek! Řekněte mi, pokud potřebujete omezit zadávání hesla na čísla a nezadávat více než 5 písmen?

    Dima, 24. dubna 2015
    Odpověď:((?=.*\d)(?=.*)(?=.*).(8,15))--- na konci místo 8 stačí dát 5

    Ahoj všichni, právě začínám...
    Můžete mi říct, co dělá:
    /^\w\w/a
    Byl bych velmi vděčný) Dobrý den, řekněte mi, jak vypsat všechna čísla v tomto výrazu přes mezeru 9 * 2 Božský cheat! Odebrány všechny otázky :-) (M1)
    (M2)
    (M3)
    (M4)
    (M5)

    Řekněte mi, jak napsat výraz, abych zjistil, kde se v textu vyskytuje

    Chtěli jste se někdy naučit regulární výrazy? Tento krátký průvodce vám pomůže se s nimi vypořádat v 6 krocích a množství příkladů vám pomůže látku upevnit.

    Co je regulární výraz?

    Regexp je skupina znaků nebo znaků, která se používá k hledání konkrétního textového vzoru.

    Regulární výraz je vzor, ​​který se shoduje s předmětem zleva doprava. Fráze "regulární výraz" se nepoužívá tak široce, místo toho se obvykle používá "regex" a "regexp". Regulární výraz se používá k nahrazení textu v řetězci, ověření formuláře, extrahování podřetězce z řetězce na základě shody vzoru atd.

    Řekněme, že vytváříte aplikaci a chcete definovat pravidla pro to, jak si uživatelé vybírají jméno. Chceme například, aby obsahoval písmena, čísla, podtržítka a spojovníky. Chceme také omezit počet znaků v uživatelském jméně, aby nevypadalo ošklivě. Proto ke kontrole použijeme následující regulární výraz:

    Tento výraz přijímá řetězce john_doe , john_doe a john12_as . Uživatelské jméno Jo však tomuto výrazu nebude odpovídat, protože obsahuje velké písmeno a je také příliš krátké.

    1. Základní zápasy

    Regulární výraz je pouze vzor znaků, které používáme k vyhledávání v textu. Například regulární výraz the znamená písmeno t následované písmenem h následovaným písmenem e .

    "the" => Tlustá kočka seděla na a rohož.

    Regulární výraz 123 odpovídá řetězci 123 . Regulární výraz se porovnává se vstupním řetězcem porovnáním každého znaku v regulárním výrazu s každým znakem ve vstupním řetězci. Regulární výraz a vstupní řetězec se porovnávají znak po znaku. Normálně regulární výraz rozlišuje velká a malá písmena, takže The neodpovídá řetězci .

    "ten" => The tlustá kočka seděla na podložce.

    2. Metaznaky

    Metaznaky jsou stavebními kameny regulárních výrazů. Nejsou nezávislé a obvykle jsou nějakým způsobem interpretovány. Některé metaznaky mají zvláštní význam, a jsou proto uzavřeny v hranatých závorkách. Metaznaky:

    Metaznaky Popis
    . Jakýkoli jednotlivý znak, kromě nového řádku.
    Vyhledejte sadu znaků uzavřených v závorkách.
    [^ ] třída negativních postav. Odpovídá libovolnému znaku, který není obsažen v hranatých závorkách
    * 0 nebo více opakování předchozího znaku.
    + 1 nebo více opakování předchozího znaku.
    ? Učiní předchozí znak volitelným.
    (n, m) Vrátí alespoň 'n', ale ne více než 'm' opakování předchozího znaku.
    (xyz) Najde skupinu postavy v daném pořadí.
    | Odděluje platné možnosti.
    \ Nezahrnuje další znak. Umožňuje vyhledávat servisní znaky () ( ) . * + ? ^ $ \ |
    ^ Najde začátek vstupního řetězce.
    $ Najde konec vstupního řetězce.

    2.1 Bod

    . - Tento nejjednodušší příklad metaznak. Metaznak. odpovídá libovolnému jednotlivému znaku. Například regulární výraz.ar znamená: jakýkoli znak následovaný písmenem a následovaným písmenem r .

    ".ar" => The auto par zapadl do gar stáří.

    2.2 Mezery mezi znaky

    Interval nebo znaková sada se také nazývá třída znaků. K jeho označení se používají hranaté závorky. Chcete-li zadat rozsah znaků v rámci třídy, je nutné použít pomlčku. Pořadí počtu znaků v sadě není důležité. Takže například regulární výraz, který má na mysli: T nebo t následovaný písmenem h následovaným písmenem e .

    "on" => The auto zaparkované v a garáž.

    Stojí za zmínku, že tečka umístěná v hranatých závorkách znamená přesně tečku a nic jiného. Regulární výraz ar[.] tedy znamená malé písmeno a následované písmenem r následovaným tečkou. .

    "ar [.]" => Garáž je dobré místo k zaparkování auta ar.

    2.2.1 Negace znakové sady

    Normálně znak ^ představuje začátek řádku, ale pokud je v hranatých závorkách, všechny znaky, které následují za ním, jsou ze vzoru vyloučeny. Například výraz [^c]ar bude odpovídat všem znakům kromě c následovaných aar .

    "[^c]ar" => Auto par zapadl do gar stáří.

    2,3 opakování

    Následující meta znaky jsou + , * nebo ? se používají k označení povoleného počtu opakování dílčího vzoru. Jejich role závisí na konkrétním případu.

    2.3.1 Hvězdička

    Tento symbol vám pomůže najít jednu nebo více kopií jakéhokoli symbolu. Regulární výraz a* znamená 0 ​​nebo více opakování znaku a. Ale pokud se tento znak objeví po znakové sadě nebo třídě, pak budou nalezena opakování celé sady. Například výraz * znamená libovolný počet těchto znaků v řetězci.

    "*" => Auto zaparkované v garáži #21.

    Znak lze také použít ve spojení s metaznakem. pro výběr řetězce z libovolných znaků.* .

    Hvězdičku lze také použít s mezerou \s, aby odpovídala řetězci mezer. Například výraz \s*cat\s by znamenal 0 nebo více mezer následovaných c následovaným aat následovaným opět 0 nebo více mezerami.

    "\s*cat\s*" => Tlustý kočka seděl na con kočka entace.

    2.3.2 Plus

    Shoduje se s jedním nebo více opakováními předchozího znaku. Například regulární výraz c.+t znamená: malé písmeno c následované alespoň jedním znakem následovaným malým písmenem t . Je třeba upřesnit, že písmeno t musí být posledním t ve větě.

    "c.+t" => Tuk kočka seděla na podložce.

    2.3.3. Otazník

    Je v regulárním výrazu metaznak? dělá předchozí znak volitelným. Tento symbol odpovídá úplné absenci nebo jedné instanci předchozího symbolu. Například regulární výraz [T]?he znamená: nepovinný velké písmeno T následované malým písmenem h následovaným malým písmenem e .
    "[T]on" => The auto je zaparkováno v garáži.
    Testovací výraz

    "[T]on" => The auto je zaparkováno v t on garáž.

    2.4 Závorky

    Závorky v regulárním výrazu, nazývané také kvantifikátory, se používají k určení, kolikrát se může znak nebo skupina znaků opakovat. Například regulární výraz (2,3) znamená, že povolený počet číslic musí být alespoň dvě číslice, ale ne více než 3 (znaky v rozsahu 0 až 9).

    "(2,3)" => Číslo bylo 9. 999 7, ale zaokrouhli jsme to na 10 .0.

    Můžeme odstranit druhé číslo. Například výraz (2,) znamená 2 nebo více číslic. Pokud odstraníme i čárku, pak výraz (3) najde pouze 3 číslice, ne méně a ne více.

    "(2,)" => Číslo bylo 9. 9997 ale zaokrouhli jsme to na 10 .0.

    "(3)" => Číslo bylo 9. 999 7, ale zaokrouhleno na 10,0.

    2.5 Skupina znaků

    Skupina znaků je skupina dílčích vzorů, která je zapsána v závorkách (...) . Jak již bylo zmíněno dříve, pokud umístíte kvantifikátor za znak v regulárním výrazu, bude opakovat předchozí znak. Ale pokud dáme kvantifikátor za skupinu znaků, bude to jen opakovat celou skupinu. Například regulární výraz (ab)* odpovídá nule nebo více výskytům znaku "ab". Můžeme také použít | je metaznak pro prokládání v rámci skupiny znaků. Například regulární výraz (c|g|p)ar znamená: malé písmeno c , g nebo p následované znakem a následovaným znakem r .

    "(c|g|p)ar" => The auto je par zapadl do gar stáří.

    2.6 Výčet

    v regulárním výrazu svislý pruh| se používá k definování enum. Enum je něco jako podmínka mezi více výrazy. Možná si myslíte, že znaková sada a enum fungují stejně, ale vůbec tomu tak není, je mezi nimi obrovský rozdíl. Výčet funguje na úrovni výrazu, zatímco znaková sada funguje na úrovni znaků. Například regulární výraz (T|t)he|car znamená: T nebo t následované malým písmenem h , následovaným malým písmenem e nebo malým písmenem c , následovaným aar .

    "(T|t)he|auto" => auto je zaparkováno v a garáž.

    2.7 Výjimka speciálních znaků

    Zpětné lomítko \ se používá v regulárním výrazu k opuštění znaku, který za ním následuje. To nám umožňuje určit znak jako odpovídající znak, včetně vyhrazených ( ) / \ + * . $^ | ? . Použít zvláštní charakter podle potřeby před něj uveďte \ .

    Například regulární výraz. slouží k nalezení libovolného jednotlivého znaku. Regulární výraz (f|c|m)at\.? znamená malé písmeno f , c nebo m následované a následovaným t následovaným dalším znakem. .

    "(f|c|m)at\.?" => The tlustá kočka seděl na rohož.

    2.8 Kotvy - Vazby

    V regulárním výrazu používáme kotvy ke kontrole, zda je odpovídající znak prvním nebo posledním znakem vstupního řetězce. Kotva je dvou typů: první je ^ , která kontroluje, zda je odpovídající znak prvním zadaným znakem, a druhá je znak dolaru, který kontroluje, zda je odpovídající znak posledním znakem zadaného řetězce.

    2.8.1. Stříška

    Znak ^ se v regulárním výrazu používá ke kontrole, zda je odpovídající znak prvním znakem ve vstupním řetězci. Pokud použijeme následující regulární výraz ^a (zkontrolujeme, zda a je první znak) pro vstupní řetězec abc , bude se rovnat a . Pokud ale použijeme regulární výraz ^b na stejný řetězec, nevrátí nic, protože ve vstupním řetězci abc znak "b" není prvním znakem. Podívejme se na další regulární výraz ^(T|t)he , což znamená: T nebo t je počáteční znak vstupního řetězce, za nímž následuje malé písmeno h a poté e .

    "(T|t)he" => The auto je zaparkováno a garáž.

    "^(T|t)he" => The auto je zaparkováno v garáži.

    2.8.2 dolar

    Znak dolaru se používá ke kontrole, zda znak ve výrazu je posledním znakem zadaného řetězce. Například (at\.)$ znamená malé písmeno a následované a t následovaným a. , který by měl řádek ukončit.

    "(at\.)" => Tlustý c na. s na. na ně na.

    "(at\.)$" => Tlustá kočka. seděl. na ně na.
    Testovací výraz

    3. Zkratky pro symboly

    Regexp umožňuje používat zkratky pro některé znakové sady, což usnadňuje práci s nimi. Proto se zde používají následující zkratky:

    4. Kontrola polohy kolem sebe

    Lookbehind a lookahead (také nazývané lookaround) jsou určité typy nezachycujících skupin (slouží k vyhledávání, ale samy nejsou jeho součástí). Výhledy se používají, když máme podmínku, že tomuto vzoru předchází nebo následuje jiný vzor. Řekněme například, že chceme získat všechna čísla předcházená $ ze vstupního řetězce $4,44 a $10,88 . Použijeme regulární výraz (?<=\$)* , которое означает: получить все числа, содержащие. и которым предшествует символ $ . Ниже приведены lookarounds, что используются в регулярных выражениях:

    4.1 Pozitivní výhled

    Pozitivní výhled znamená, že tato část výrazu musí následovat po předchozím výrazu. Návratová hodnota obsahuje text, který odpovídá první části výrazu. Závorky se používají k definování pozitivního výhledu. Uvnitř nich umístěte otazník a rovnítko: (?=...) . Samotný výraz se zapisuje za = . Například výraz (T|t)he(?=\sfat) je velké nebo malé písmeno T následované h a e . V závorkách definujeme pozitivní výhled, který říká motoru regulárních výrazů, aby hledal The nebo the následovaný fat .

    "(T|t)the(?=\sfat)" => The tlustá kočka seděla na podložce.

    4.2 Negativní výhled

    Negativní předhled se používá, když potřebujeme získat všechny shody v řetězci, který nenásleduje konkrétní vzor. Negativní výhled je definován stejným způsobem jako pozitivní výhled, jen s tím rozdílem, že místo rovnítka používáme znaménko negace! . Náš výraz má tedy následující tvar: (?!...) . Nyní zvažte (T|t)he(?!\sfat) , což znamená získat všechna The nebo the ve vstupním řetězci, za kterým nenásleduje slovo tuk před mezerou.

    "(T|t)he(?!\sfat)" => Tlustá kočka seděla na a rohož.

    4.3 Pozitivní vzhled

    Pozitivní lookbehind se používá k získání všech shod, kterým předchází konkrétní vzor. Pozitivní lookbehind se označuje takto: (?<=...) . Например, регулярное выражение (?<=(T|t)he\s)(fat|mat) означает получить все fat или mat из строки ввода, которые идут после слова The или the .

    "(? The Tlustý kočka seděla na rohož.

    4.4 Negativní lookbehind

    Negativní lookbehind se používá k získání všech shod, kterým nepředchází konkrétní vzor. Negativní lookbehind je označen výrazem (?

    5. Vlajky

    Příznaky se také často označují jako modifikátory, protože mohou změnit výstup regulárního výrazu. Níže uvedené příznaky jsou integrální a lze je použít v libovolném pořadí nebo kombinaci regulárních výrazů.

    5.1 Nerozlišují se malá a velká písmena

    Modifikátor i se používá k vyhledávání shod, které nerozlišují malá a velká písmena. Například výraz /The/gi znamená velké T následované h a e . A úplně na konci výrazu je i , díky kterému můžete ignorovat velká a malá písmena. g se používá k nalezení vzoru v celém vstupním řetězci.
    "ten" => The tlustá kočka seděla na podložce.
    Testovací výraz

    "/the/gi" => The tlustá kočka seděla na a rohož.

    5.2 Globální vyhledávání

    Modifikátor se používá k provedení globálního vyhledávání vzoru (hledání bude pokračovat po první shodě). Například regulárnímu výrazu /.(at)/g odpovídá jakýkoli jiný znak než nový řádek následovaný malým písmenem a a poté t . Protože jsme použili příznak g na konci regulárního výrazu, najde nyní všechny shody na vstupním řádku, nejen první (což je standard).

    "/.(zavináč)/" => The Tlustý kočka seděla na podložce.

    "/.(at)/g" => The tlustá kočka seděla na rohož.

    5.3 Víceřádkové vyhledávání

    Modifikátor m je nutný k provedení víceřádkového vyhledávání. Jak již bylo zmíněno dříve, kotvy (^, $) se používají ke kontrole, zda vzor je začátek nebo konec řetězce. Pokud ale chceme, aby vazby fungovaly na každém řádku, musíme použít příznak m. Například regulární výraz /at(.)?$/gm znamená: malé písmeno a následované t a cokoliv kromě nového řádku. A díky příznaku m tento modul regulárních výrazů odpovídá vzoru na konci každého řádku řetězce.

    "/.at(.)?$/" => Tuk
    kočka seděla
    na rohož.

    "/.at(.)?$/gm" => The Tlustý
    kočka seděl