Published: 3. 3. 2012   Category: GNU/Linux

Workshop: Regulární výrazy

Abstrakt: Workshop zaměřený pro začátečníky i pokročilejší uživatele týkající se popisu řetězců pomocí regulárních výrazů (regexy). Začneme trochou teorie a postupně si projdeme spoustu příkladů od těch jednodušších až po ty složitější. Využijeme nástroje jako je grep, sed a editor ViM, ale podíváme se i na další utility pro zpracování textu.

Tahák

GNU grep/sed GNU grep -E GNU awk vim Perl
znaky
libovolný znak (kromě \n) . . . . .
množina znaků [  ] [  ] [  ] [  ] [  ]
kromě těchto znaků [^   ] [^   ] [^   ] [^   ] [^   ]
opakování
libovolný počet * * * * *
alespoň jeden \+ + \+ \+ +
nanejvýš jeden \? ? \? \? ?
přesně n× \{n\} {n} {n} \{n\} {n}
minimálně \{min,\} {min,} {min,} \{min,\} {min,}
min až max \{min,max\} {min,max} {min,max} \{min,max\} {min,max}
pozice
začátek řádku ^ ^ ^ ^ ^
konec řádku $ $ $ $ $
začátek slova \< \< \< (\y) \< \A (\b)
konec slova \> \> \> (\y) \> \z (\b)
závorky a paměť
skupina se zapamatováním \(  \) (  ) (  ) \(  \) (  )
třetí zapamatovaný \3 \3 \3 \3 \3
Meta POSIX Unicode Množina Popis
\d [:digit:] \p{IsDigit} [0-9] Číslice
\D \P{IsDigit} [^0-9] Cokoliv mimo číslici
\s [:space:] \p{IsSpace} [ \t\n\r\f] Bílý znak
\S \P{IsSpace} [^ \t\n\r\f] Cokoliv mimo bílého znaku
\w [:word:] \p{IsWord} [a-zA-Z0-9_] Znaky identifikátorů
\W \P{IsWord} [^a-zA-Z0-9_] Cokoliv mimo znaků identifikátorů
\b hranice slova, opakem je \B
[:alnum:] \p{PosixAlnum} [A-Za-z0-9] Alfanumerické znaky
[:xdigit:] \p{PosixXDigit} [A-Fa-f0-9] Hexadecimální čísla
[:print:] \p{PosixPrint} [\x20-\x7E] Tisknutelné znaky
[:alpha:] \p{PosixAlnum} [A-Za-z] Abecední znaky

0. Stáhněte si příklady, na kterých si vše vyzkoušíme.

V balíku regexp_workshop.tar.gz naleznete textové soubory, které obsahují data na kterých budeme testovat regulární výrazy. V příkazové řádce provedete stažení a rozbalení následovně:

wget http://bruxy.regnet.cz/linux/if2012/regex_workshop.tar.gz
tar xvzf regexp_workshop.tar.gz
ls -l priklady/

Soubor obce.txt obsahuje seznam všech obcí České republiky (k roku 2011). Na každém z jeho řádku najdete následující údaje oddělené mezerou:

1. Zjistěte počet obcí České republiky.


2. Do samostatného souboru jmena.txt si uložte pouze názvy obcí.


3. Zjistěte TOP 10 názvů obcí.


4. Vyhledejte obce s názvem Žďár nebo Mýto


5. Najděte obce, které nemají v názvu samohlásku


6. Najděte názvy obcí, které obsahují 5 a více znaků „o“


7. Názvy obcí, které začínají na Velký nebo Velké


8. Názvy obcí, které jsou „nad Sázavou“ nebo „nad Vltavou“


9. Zjistěte obce s nejkratším názvem.


10. Obec s nejdelším názvem


11. Testujeme správnost názvu proměnné (indentifikátor) v jazyce C.

Název proměnné v jazyce C může obsahovat malé a velké znaky anglické abecedy, podtržítko a číslo. Název proměnné nesmí začínat číslem.

Rozšířená Backusova–Naurova Forma (EBNF):

nondigit ::= {_|A..Z|a..z}
digit    ::= {0..9}
identifier ::= nondigit,{nondigit|digit}

Syntaktický diagram z referenční příručky IBM C/C++ překladače:

               .------------.
               V            |
>>-+-letter-+----+-letter-+-+----------------------------------><
   '-_------'    +-digit--+
                 '-_------'
	 

12. Čísla s plovoucí řadovou čárkou v jazyce C.

Čísla s plovoucí řadovou čárkou jsou reprezentována zápisem, který tvoří celočíselná část, desetinná tečka, desetinná část, exponenciální část a volitelný sufix. Příklady: 5.3876e4 (53.876), 4e-11 (0.00000000004), 1e+5 (100000), 7.321E-3 (0.007321), .8e3 (800), 2.0f (2.0).

Syntaktický diagram z referenční příručky IBM C/C++ překladače:

Decimal floating-point literal syntax
 
     .-----------.     .-------.
     V           |     V       |
>>-+---+-------+-+--.----digit-+--+--------------+-+--+---+----><
   |   '-digit-'                  '-| exponent |-' |  +-f-+
   | .-------.                                     |  +-F-+
   | V       |                                     |  +-l-+
   +---digit-+--.--+--------------+----------------+  '-L-'
   |               '-| exponent |-'                |
   | .-------.                                     |
   | V       |                                     |
   '---digit-+--| exponent |-----------------------'
 
Exponent:
                  .-------.
                  V       |
|--+-e-+--+----+----digit-+-------------------------------------|
   '-E-'  +-+--+
          '- --'

13. Otestujte platnost IPv4 adresy.


14. Opravte "uvozovky" podle typografických „pravidel“.


Zdroje a odkazy