Regulární výrazy 1

40. hodina MVOP WBF

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

Děkuji za pozornost!

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