* Regulyarnye vyrazheniya (shablony) *
V dannoj glave opisyvaetsya sintaksis regulyarnyh vyrazhenij. CHashche vsego
v Pel oni ispol'zuyustya v operatorah poiska i zameny takih kak s//
m/ operatorah svyazki =~ ili != i t.d.
Kak pravilo vse eti operatory imeyut shozhie opcii takie kak:
i - ne razlichat' strochnye i zaglavnye bukvy.
m - schitat' stroku mnogostrochnoj.
s - odnostrochnaya stroka.
x - rasshirennyj sintaksis ( ispol'zovanie probelov i kommentariev)
Obychno vse eti opcii oboznachayut kak '/x'. Ih mozhno ispol'zovat' dazhe
vnutri shablonov, ispol'zuya novuyu konstrukciyu (?...)
Regulyarnye vyrazheniya ili shablony (pattern) to zhe samoe chto i regexp
procedury v YUnikse. Vyrazheniya i sintaksis zaimstvovan iz svobodno
rasprostranyaemyh procedur V8 Genri Spensera (Henry Spencer) tam zhe
oni podrobno i opisany.
V shablonah ispol'zuyutsya sleduyushchie metasimvoly (simvoly oboznachayushchie
gruppy drugih simvolov) chasto nazyvaemyh egrep - standartom:
\ - schitat' sleduyushchij metasimvol kak obychnyj simvol.
^ - nachalo stroki
. - odin proizvol'nyj simvol. Krome '\n' - konec stroki.
$ - konec stroki
| - al'ternativa (ili)
() - gruppirovka
[] - klass simvolov
Metasimvoly imeyut modifikatory (pishutsya posle metasimvola):
* - povtoryaetsya 0 ili bol'shee chislo raz
+ - povtoryaetsya 1 ili bol'shee chislo raz
? - 1 ili 0 raz
{n} - tochno n raz
{n,} - po men'shej mere raz
{n,m} - ne menshe n, no i ne bol'she m
Vo vse drugih sluchayah figurnye skobki schitayutsya obychnymi (regulyarnymi)
simvolami. Takim obrazom '*' ekvivalentna {0,} , '+' - {1,}
i '?' - {0,1}. n i m ne mogut byt' bol'she 65536.
Po umolchaniyu dejstvie metasimvolov "zhadno" (greedy). Sovpadenie
rasprostranyaetsya stol'ko raz skol'ko vozmozhno ne uchityvaya rezul'tat
dejstviya sleduyuyushchih metasimvolov. Esli vy hotite "umen'shit' ih appetit"
to ispol'zujte simvol '?'. |to ne izmenyaet znachenie metasimvolov
prosto umen'shaet rasprostranenie. Takim obrazom:
*? - stanet 0 i bolee
+? - 1 i bolee
?? - 0 ili 1 raz
{n}? - tochno n raz
{n,}? - ne men'she n raz
{n,m}? - bol'she ili ravno n i men'she m raz
SHablony rabotayut tak zhe kak i dvojnye kavychki poetomu v nih mozhno
ispol'zovat' `\` - simvoly (bakslesh-simvoly):
\t - simvol tabulyacii
\n - novaya stroka
\r - perevod karetki
\A - perevol formata
\v - vertikal'naya tabulyaciya
\a - zvonok
\e - escape
\033 - vos'merichnaya zapis' simvola
\x1A - shestnadcaterichnaya
\c[ - control simvol
\l - nizhnij registr sleduyushchego simvola
\u - verhnij registr -//-
\L - vse simvoly v nizhnem registre do \E
\U - v verhnem -//-
\E - ogranichitel' smeny registra
\Q - otmena dejstviya kak metasimvola
Dopolnitel'no v Pel dobavleny sleduyushchie metasimvoly:
\w - alfavitno-cifrovoj ili '_' simvol
\W - ne alfavitno-cifrovoj ili '_' simvol
\s - odin probel
\S - odin ne probel
\d - odna cifra
\D - odna ne cifra
Obratite vnimanie chto vse eto "odin" simvol. Dlya oboznacheniya posledovatel'nosti
primenyajte modifikatory. Tak:
\w+ - slovo
\d+ - celoe chislo
[+-]?\d+ - celoe so znakom
[+-]?\d+\.?\d* - chislo s tochkoj
Krome togo sushchestvuyut mnimye metasimvoly. Oboznachayushchie ne sushchestvuyushchie
simvoly v meste smeny znacheniya. Takie kak:
\b - granica slova
\B - ne granica slova
\A - nachalo stroki
\Z - konec stroki
\G - konec dejstviya m//g
Granica slova (\b) - eto mnimaya tochka mezhdu simvolami \w i \W.
Vnutri klassa simvolov '\b' oboznachaet simvol backspace (stiraniya).
Metasimvoly \A i \Z - analogichny '^' i '$' no esli nachalostroki '^'
i konec stroki '$' dejstvuyut dlya kazhdoj stroki v mnogostorochnoj stroke
to \A i \Z oboznachayut nachalo i konec vsej mnogostorchnoj stroki.
Esli vnutri shablona primenyaetsya gruppirovka (kruglye skobki)
to nomer podstroki gruppy oboznachaetsya kak '\cifra'.
Zamet'te chto za shablonom v predelah vyrazheniya ili bloka eti gruppy oboznachayutsya
kak '$cifra'. Krome etogo sushchestvuyut dopolnitel'nye peremennye:
$+ - oboznachaet poslednee sovpadenie
$& - vse sovpadenie
$` - vse do sovpadeniya
$' - vse posle sovpadeniya
Primer:
$s = "Odin 1 dva 2 i tri 3";
if ($s =~ /(\d+)\D+(\d+)/)
{
print "$1\n"; # Rezul'tat '1'
print "$2\n"; # '2'
print "$+\n"; # '2'
print "$&\n"; # '1 dva 2'
print "$`\n"; # 'Odin '
print "$'\n"; # ' i tri 3'
}
Pel versii 5 soderzhit dopolnitel'nye konstrukcii shablonov:
(?#kommentarij) - kommentarij v tele shablona.
(?:shablon) - gruppirovka kak i '( )' no bez obratnoj ssylki
(?=shablon) - "zaglyadyvanie" vpered. Naprimer /\w+(?=\t)/
sootvetstvuet slovu za kotorym idet tabulyaciya
no simvol '\t' ne vklyuchaetsya v rezul'tat.
Primer:
$s = "1+2-3*4";
if ($s =~ /(\d)(?=-)/) # Naiti cifru za kotoroj stoit '-'
{
print "$1\n"; # Rezul'tat '2'
}
else { print "oshibka poiska\n";}
(?!shablon) - "zaglyadyvanie" vpered po otricaniyu.
Primer:
$s = "1+2-3*4";
if ($s =~ /(\d)(?!\+)/) # Naiti cifru za kotoroj ne stoit '+'
{
print "$1\n"; # Rezul'tat '2'
}
else { print "oshibka poiska\n";}
(?ismx) - "vnutrennie" modifikatory. Udobno primenyat' v shablonah
gde naprimer nuzhno vnutri shablona ukazat' modifikator.
Pravila regulyarnogo vyrazheniya. (regex)
1. Lyuboj simvol oboznachaet sebya samogo esli eto ne metasimvol.
Esli vam nuzhno otmenit' dejstvie metasimvola to postav'te
pered nim '\'.
2. Stroka simvolov oboznachaet stroku etih simvolov.
3. Mnozhestvo vozmozhnyh simvolov (klass) zaklyuchaetsya v kvadratnye
skobki '[]' eto znachit chto v dannom meste mozhet stoyat' odin
iz ukazannyh v skobkah simvol. Esli pervyj simvol v skobkah
eto '^' - znachit ne odin iz ukazannyh simvolov ne mozhet
stoyat' v dannom meste vyrazheniya. Vnutri klassa mozhno upotreblyat'
simvol '-' oboznachayushchij diappazon simvolov. Naprimer a-z
odin iz malyh bukv latinskogo alfavita, 0-9 - cifra i t.d.
4. Vse simvoly, vklyuchaya special'nye mozhno oboznachat' s
pomoshch'yu '\' kak v yazyke S.
5. Al'ternativnye posledovatel'nosti razdelyayutsya simvolom '|'
Zamet'te chto vnutri kvadratnyh skobok eto obychnyj simvol.
6. Vnutri regulyarnogo vyrazheniya mozhno ukazyvat "podshablony"
zaklyuchaya ih v kruglye skobki i ssylat'sya na nih kak '\nomer'
Pervaya skobka oboznachaetsya kak '\1'.
Last-modified: Sat, 08 Aug 1998 05:51:08 GMT