Regulární výrazy

MVOP WBF

Bc. Matěj Cajthaml — SSPŠ

©

Regulární výrazy

Regulární výrazy

  • = regular expression, regex
  • staví na automatech v teoretické informatice
  • slouží k vyhledávání, validaci a dalších věcí v textu

Vyhledávání v textu je složité. Proč?

Vyhledávání

Práce

Vytvořte program, který zpracuje následující data do jednotného formátu.

+xxxXXXxxxXXX
XXXxxxXXX
xxxXXXxxxXXX
(+xxx) XXXxxxXXX
+xxx XXX xxx XXX
+xxx XXXxxxXXX
...

Syntax

  • výraz je řetězec znaků
  • regex má různé klíčové znaky a sekvence
  • definujeme i literály

Použití v JS

Použití v JS

  • regexy podporuje mnoho funkcí:
    • .replace
    • .split
  • pro regexy máme další funkce, které si vysvětlíme později:
    • .match
    • .search
    • .test

Vytvoření regexu

Modifikátory

  • = regex flags
  • za definici regulárního výrazu můžeme přidat modifikátory
  • modifikátory mění chování regexu, resp. co dělá při spuštění

Modifikátory

  • /g — globální, hledá všechny výskyty
  • /i — ignoruje velikost písmen
  • a další

Kvantifikátory

  • = kolikrát se výraz opakuje
  • můžeme použít:
    • * — 0 až n
    • + — 1 až n
    • ? — 0 nebo 1

Regulární výrazy

Práce

Co zbyde v řetězci pro aplikaci nahrazení za - ve vstupu bbbbbbbbbbbbbaaaaaaa pro níže uvedené výrazy?

  1. /a*/
  2. /a*/g
  3. /bb?a*/
  4. /b?a*/g

Skupiny

  • části můžeme seskupit do skupin pomocí kulatých závorek ()
  • skupiny můžeme opakovat pomocí kvantifikátorů
  • můžeme zachytit v kódu
  • např. /(ahoj )*/g

Regulární výrazy

Práce

Co zbyde v řetězci pro aplikaci nahrazení za - ve vstupu madagascar obsahuje lemury, kteří spí pro níže uvedené výrazy?

  1. /(lemur)*/g
  2. /(mada(ga)?scar)/g
  3. /(b)*o*l*e+s*í*/g

Přesné kvantifikátory

  • za znak či skupinu můžeme pomocí složených závorek {}
  • uvnitř 1 až 2 parametry, určující minimální a maximální počet opakování
  • např. /(ab){2,4}/

Regulární výrazy

Práce

Co zbyde v řetězci pro aplikaci nahrazení za - ve vstupu ababababbbababab pro níže uvedené výrazy?

  1. /(ab){3,}/g
  2. /bb{2}/g
  3. /baba{1,3}/g

Co kdybychom chtěli pětkrát označit *?

Bude fungovat následující regulární výraz?

/*{5}/g

Zrušení významu

  • stejně jako v programování stačí označit znak pomocí zpětného lomítka — \
  • /\*{5}/g

Nebo

  • pomocí | můžeme označit alternativní možnosti
  • např. /a|b/g

Regulární výrazy

Práce

Co zbyde v řetězci pro aplikaci nahrazení za - ve vstupu ahoj jak se mas pro níže uvedené výrazy?

  1. /(ahoj|se)/g
  2. /(a|j|k)/g
  3. /((j )|(e )|(k ))/g

Rozmezí znaků

  • pomocí [] můžeme označit rozmezí znaků
  • např. /[abcde]/g — může obsahovat a, b, c, d a e
  • např. /[a-z]/g — může obsahovat jakékoliv písmeno od a do z
  • např. /[a-zA-Z0-9]/g — může obsahovat jakékoliv písmeno od a do z, od A do Z a číslice od 0 do 9

Regulární výrazy

Práce

Co zbyde v řetězci pro aplikaci nahrazení za - ve vstupu Bude to 4001,- Kč, paní K! pro níže uvedené výrazy?

  1. /[a-z]+/g
  2. /[1-4]{2}/g
  3. /[,\- !]+/g
  4. /[,\- !]/g

.test

  • vrací booleanovu hodnotu, zda se regulární výraz shoduje s řetězcem

Testování

.exec

  • vrací pole, ve kterém jsou nalezené výskyty regulárního výrazu
  • obsahuje index, daný index a další
  • v případě, že není nalezen žádný výskyt, vrací null

Exekuce

.match

  • vrací pole, ve kterém jsou nalezené výskyty regulárního výrazu
  • v případě, že není nalezen žádný výskyt, vrací null

Mečování

.search

  • vrací index prvního nalezeného výskytu regulárního výrazu
  • v případě, že není nalezen žádný výskyt, vrací -1

Nástroje

Opakování

Co vybere následující regulární výraz?

  • /[a-z]+/
  • /[a-z]+/g
  • /[a-z]+/i
  • /(+420)? ?([0-9] ?){3}/gi

Zástupné znaky

Zástupné znaky

  • = tokeny, meta sekvence
  • sekvence znaků se speciální významem
  • často nějaké zkratky

Meta sekvence

  • . — vybere jeden jakýkoliv znak
  • \s — jakýkoliv whitespace znak
  • \S — opak \s
  • \d — jeden znak
  • \D — opak \D
  • \w — znak, který se může objevit ve slově

Regulární výrazy

Práce

Co zbyde v řetězci pro aplikaci nahrazení za - ve vstupu Kočka #302, které je 5,
je tu proto, aby tu byla.
pro níže uvedené výrazy?

  1. /.*/g
  2. /\d+/g
  3. /\w+/g

Pokročilé rozmezí

Jaký je rozdíl mezi (a|b) a [ab]?

Negace rozmezí

  • znegujeme znaky či rozmezí
  • vše až na dané výjimky
  • [^xyz] — cokoliv až na x, y a z
  • [^5-8] — cokoliv až na 5, 6, 7 a 8

Další rozmezí

  • [[::ascii::]]
  • [[::lower::]]
  • a další...

Dříve uvedené rozmezí v JS nefungují. Proč?

Pokročilé skupiny

Zrušení seskupení

  • chceme opakování dané části bez toho, abychom ji měli ve výběru
  • /(?:to co chceme neseskupovat)/g

Podmínky

  • vybereme, jestli něco je před nebo za prvkem
  • několik variant:
    • test(?= to je) — vybere test, pokud se za ním nachází to je
    • (?<=test)není — vybere není, pokud se před ním nachází test
    • a další...

Zamezení

Začátek a konec stringu

  • ^ — označuje začátek stringu
  • $ — označuje konec stringu

  • ^ad$ — celá kontrola musí být rovna tokenu ad

Jak se chovají znaky ^$ společně s modifikátorem m?

Word boundaries

  • metaznaky
  • nezachytávají žádné znaky, ale jejich pozice
  • \b — místo, kde končí či začíná slovo
  • \B — místa, kde \b nevybere
  • např. /\bkočička\b/g

Regulární výrazy

Práce

Co zbyde v řetězci pro aplikaci nahrazení za - ve vstupu Kočka #302, které je 5,
je tu proto, aby tu byla.
pro níže uvedené výrazy?

  1. /(?:\b\w+\b)+/g
  2. /(?:\B\w+\B)+/g

Chování tokenů

Lazy vs. greedy

  • některé tokeny jsou greedy, to znamená, že chtějí označit samo sebou co nejvíce znaků
  • to nechceme a proto můžeme říct, aby to zkusili co nejméněkrát, aby byly ostatní skupiny naplněny
  • a\w*? — označ co nejméně a

  • backtracking problém

Regulární výraz

Práce

Co znamená regulární výraz /<[^<>]+>/gm?

Děkuji za pozornost!

  • matej.cajthaml@ssps.cz
  • https://ssps.cajthaml.eu/