![]() |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
|
Escape znak | Ekvivalentní zápis | Význam |
\d | [0-9] | Číslice |
\D | [^0-9] nebo [^\d] | Cokoliv mimo číslici |
\w | [_0-9a-zA-Z] | Znaky identifikátorů |
\W | [^_0-9a-zA-Z] nebo [^\w] | Cokoliv mimo znaků identifikátorů |
\s | [\ \n\r\t\f] | Bílý znak |
\S | [^ \n\r\t\f] nebo [^\s] | Cokoliv mimo bílého znaku |
. | [^\n] | Libovolný znak mimo znaku nového řádku (chování se dá pozměnit přepínačem s) |
Poznámka - Ekvivalenty \w a [_0-9a-zA-Z]) resp. \W a [^_0-9a-zA-Z] v poslední tabulce nejsou skutečně 100% ekvivalenty. Vzory [_0-9a-zA-Z] a \w se mají chovat stejně, ale v případě použití locales tomu tak není. Předveďme si důkaz:
use locale;
print "MATCHED" if "č" =~ /\w/; #true
print "MATCHED" if "č" =~ /[_0-9a-zA-Z]/; #false
Nyní zapíšeme regulární výraz pro formát 12hodinového zápisu času.
/^[01]\d[:\.][0-5]\d[:\.][0-5]\d[ ]?[pPaA][mM]$/;
Vysvětleme si, jak se tento regulární výraz vyhodnocuje:
Je tu problém. Našemu výrazu vyhoví i čas 13 - 19 hodin. Musíme použít znak |. 1. operand bude hledat, zda jsou hodiny mezi 00 a 09, pokud ne, 2.operand zjistí zda nejsou ještě mezi 10 až 12.
/^((0\d)|(1[0-2]))[:\.][0-5]\d[:\.][0-5]\d[ ]?[pPaA][mM]$/;
Regulárnímu výrazu ((0\d)|(1[0-2])) vyhovují čísla 01 až 12, zbytek je stejný jako v minulém příkladu. Celý výraz ještě o něco zjednoduší přepínač /i. Zápis [pPaA][mM] pak může vypadat o něco pohodlněji.
/^((0\d)|(1[0-2]))[:\.][0-5]\d[:\.][0-5]\d[ ]?[pa]m$/i;
Sice ani toto není dokonalé řešení (vyhoví i takové věci jako "10.10:40pM"), ale pro představu nám posloužilo.
Toto asi nebudete nikdy potřebovat, ale koho to zajímá ať čte dál. Třída znaků se zadává pomocí zápisu \p{třída}. Pokud chceme doplněk třídy (tedy vše mimo toho, co do třídy patří), použijeme zápis \P{třída}.
V 1. tabulce jsou jen pro představu 2 Unicode třídy. Existuje jich ale mnohem více (man perlretut).
Třída | Význam |
IsSm | matematický symbol |
IsSc | znaky měny |
Znakem měny je například dolar:
print "MATCHED" if "r" =~ /^\p{IsSc}$/; #nevyhovuje
print "MATCHED" if "\$" =~ /^\p{IsSc}$/; #vyhovuje
Dále si Perl některé třídy sám definuje.
Mají 2 možnosti zápisu. Buď \p{třída} nebo [:třída:]. Zápis [:třída:] je možný jen uvnitř dalších [ ]. Samotné [:třída:] by totiž znamenalo množinu znaků :, t, ř, í, d, a. Je tedy nutný zápis [[:třída:]].
UNICODE \p{třída} | POSIX [:třída:] | Význam |
IsAlpha | alpha | Anglická písmena |
IsAlnum | alnum | Anglická písmena a číslice |
IsASCII | ascii | Znaky ASCII 0-127 |
IsSpace | blank | Mezera, tabulátor |
IsCntrl | cntrl | Řídící znaky |
IsDigit | digit | Číslice |
IsGraph | graph | Grafické |
IsLower | lower | Malá anglická písmena |
IsPrint | Tisknutelné znaky a mezera | |
IsPunct | punct | Interpunkce a pomocné znaky |
IsSpacePerl | space | Bílý znak |
IsUpper | upper | Velká anglická písmena |
IsWord | word | Alfanumerický znak nebo podtržítko |
IsXDigit | xdigit | Šestnáckové číslo |
Použití ukazuje následující kód. Všimněte si odlišných barev hranatých závorek. Vnější definují množinu znaků, jejíž obsahem je třída xdigit.
print "MATCHED" if "5" =~ /^[[:xdigit:]]$/; #vyhovuje - 5 je hexadecimální
print "MATCHED" if "a" =~ /^[[:xdigit:]]$/; #vyhovuje - a je hexadecimální
print "MATCHED" if "g" =~ /^[[:xdigit:]]$/; #nevyhovuje - g není hexadecimální
Perl umožňuje POSIX třídy negovat. Negovaná [:třída:] je [:^třída:].
Na závěr ještě něco k definici unicode tříd. Je nutné vytvořit podprogram se stejným jménem jako třída. Jeho návratovou hodnotou jsou řádky. Je-li na řádku 1 číslo, určuje ASCII znak, určený 16kově. Jsou-li na řádku 2 čísla, oddělená mezerou, jde o rozsah. Definujeme si třídu IsZavorka, které vyhoví 1 ze znaků (, ), {, }, [, ], <, > - tedy závorka kulatá, složená, hranatá nebo lomená.
print "MATCHED" if "(" =~ /^\p{IsZavorka}$/; #vyhovuje
sub IsZavorka {
return <<END;
28 29
3C
3E
5B
5D
7B
7D
END
}
Třídy lze definovat i pomocí již definovaných tříd. V takovém případě je do návratové hodnoty podprogramu třeba uvést řádek [+!-&]balík::Trida. Implicitní unicode třídy jsou v balíku utf8. + (sjednocení) funguje pro přidání znaků z příslušné třídy, ! (rozdíl) pro odebrání znaků, - (doplněk) pro všechny znaky mimo znaky z této třídy a & (průnik) vybere pouze znaky, které jsou v této třídě a třídě jiné. Pro definici třídy IsBracket, která má stejný význam jako IsZavorka stačí psát toto:
sub IsBracket {
return <<END
+main::IsZavorka
END
}
Další možností definice unicode tříd je podle typu písma. Existují například třídy InHebrew, InMathematicalOperators. Celý seznam je na manuálové stránce perlunicode.
Toto téma by zabralo několik samostatných článků. Mnohem více o unicode třídách a jejich definicích na manuálových stránkách
|
||
KOMENTARZE
Nie ma komentarzy dla tej pozycji. |
||
Tylko zarejestrowani użytkownicy mogą dopisywać komentarze.
|
1. |
Pacman linux Download: 5004x |
2. |
FreeBSD Download: 9214x |
3. |
PCLinuxOS-2010 Download: 8700x |
4. |
alcolix Download: 11096x |
5. |
Onebase Linux Download: 9809x |
6. |
Novell Linux Desktop Download: 0x |
7. |
KateOS Download: 6372x |
1. |
xinetd Download: 2535x |
2. |
RDGS Download: 937x |
3. |
spkg Download: 5040x |
4. |
LinPacker Download: 10209x |
5. |
VFU File Manager Download: 3311x |
6. |
LeftHand Mała Księgowość Download: 7340x |
7. |
MISU pyFotoResize Download: 2973x |
8. |
Lefthand CRM Download: 3673x |
9. |
MetadataExtractor Download: 0x |
10. |
RCP100 Download: 3270x |
11. |
Predaj softveru Download: 0x |
12. |
MSH Free Autoresponder Download: 0x |