Ââåäåíèå â ðåãóëÿðíûå âûðàæåíèÿ. Ñèíòàêñèñ.
PHP îòëè÷àåòñÿ íàëè÷èåì î÷åíü ìîùíûõ è ãèáêèõ ìåõàíèçìîâ
äëÿ ðàáîòû ñ äâóìÿ ñàìûìè ÷àñòî èñïîëüçóåìûìè òèïàìè äàííûõ:
ñòðîêàìè è ìàññèâàìè. Îá ýòîì ìû ãîâîðèëè â îäíîì èç ïðåäûäóùèõ
âûïóñêîâ. Îäíàêî â PHP åñòü åùå îäèí ìåõàíèçì îáðàáîòêè
ñòðîê, êîòîðûé, ââèäó ñâîåé ñëîæíîñòè è ìîùè áûë ïðîïóùåí ìíîþ. ß
ãîâîðþ î ìåõàíèçìå ðåãóëÿðíûõ âûðàæåíèé (regular
expressions). Íàñòàëî âðåìÿ ïîãîâîðèòü î íèõ, ïîòîìó ÷òî â
äàëüíåéøåì íàì î÷åíü ÷àñòî ïîòðåáóåòñÿ èñïîëüçîâàòü èõ. Êðîìå òîãî
èñïîëüçîâàíèå ðåãóëÿðíûõ âûðàæåíèé âî ìíîãèõ ñèòóàöèÿõ ïîìîæåò âàì
çàìåíèòü êó÷ó êîäà âñåãî îäíîé ñòðî÷êîé. Åäèíñòâåííàÿ ïðîáëåìà,
êîòîðàÿ îáû÷íî âîçíèêàåò ïðè ðàáîòå ñ ðåãóëÿðíûìè âûðàæåíèÿìè - èõ
î÷åíü íåîáû÷íûé, è, ïîíà÷àëó, ñîâåðøåííî íåïîíÿòíûé ñèíòàêñèñ.
Ïîýòîìó ÿ ïîñòàðàþñü ðàññêàçàòü î ñèíòàêñèñå ðåãóëÿðíûõ âûðàæåíèé ïî
âîçìîæíîñòè áîëåå ïðîñòî è ïîäðîáíî.
Ðåãóëÿðíûå âûðàæåíèÿ
Îáùàÿ èíôîðìàöèÿ
Ðåãóëÿðíîå âûðàæåíèå (regular expression,
regexp, ðåãýêñï) - ìåõàíèçì, ïîçâîëÿþùèé
çàäàòü øàáëîí äëÿ ñòðîêè è îñóùåñòâèòü ïîèñê äàííûõ, ñîîòâåòñòâóþùèõ
ýòîìó øàáëîíó â çàäàííîì òåêñòå. Êðîìå òîãî, äîïîëíèòåëüíûå ôóíêöèè
ïî ðàáîòå ñ regexp'àìè ïîçâîëÿþò ïîëó÷èòü íàéäåííûå äàííûå â âèäå
ìàññèâà ñòðîê, ïðîèçâåñòè çàìåíó â òåêñòå ïî øàáëîíó, ðàçáèåíèå
ñòðîêè ïî øàáëîíó è ò.ï. Îäíàêî ãëàâíîé èõ ôóíêöèåé, íà êîòîðîé
îñíîâàíû âñå îñòàëüíûå, ÿâëÿåòñÿ èìåííî ôóíêöèÿ ïîèñêà â òåêñòå
äàííûõ, ñîîòâåòñòâóþùèõ øàáëîíó, îïèñàííîìó â ñèíòàêñèñå ðåãóëÿðíûõ
âûðàæåíèé.
Î÷åíü ÷àñòî ðåãóëÿðíûå âûðàæåíèÿ èñïîëüçóþòñÿ äëÿ òîãî, ÷òîáû
ïðîâåðèòü, ÿâëÿåòñÿ ëè äàííàÿ ñòðîêà ñòðîêîé â íåîáõîäèìîì ôîðìàòå.
Íàïðèìåð ñëåäóþùèé regexp ïðåäíàçíà÷åí äëÿ ïðîâåðêè òîãî, ÷òî ñòðîêà
ñîäåðæèò êîððåêòíûé e-mail àäðåñ: /^\w+([\.\w]+)*\w@\w((\.\w)*\w+)*\.\w{2,3}$/
Âûãëÿäèò, íà ïåðâûé âçãëÿä, äîâîëüíî ñòðàøíî :-) Íî, òåì íå
ìåíåå, ýòî ðàáîòàåò, è ðàáîòàåò î÷åíü õîðîøî. À êîãäà âû íàó÷èòåñü
ïèñàòü è èñïîëüçîâàòü regexp'û â ñâîåì êîäå - ýòî åùå áóäåò è ñèëüíî
îáëåã÷àòü âàì æèçíü.
Ðåãóëÿðíûå âûðàæåíèÿ ïðèøëè ê íàì èç Unix è Perl. Â
PHP ñóùåñòâóåò äâà ðàçëè÷íûõ ìåõàíèçìà äëÿ îáðàáîòêè
ðåãóëÿðíûõ âûðàæåíèé: POSIX-ñîâìåñòèìûå è Perl-ñîâìåñòèìûå. Èõ
ñèíòàêñèñ âî ìíîãîì ïîõîæ, îäíàêî Perl-ñîâìåñòèìûå ðåãóëÿðíûå
âûðàæåíèÿ áîëåå ìîùíûå è, ê òîìó æå, ðàáîòàþò íàìíîãî áûñòðåå (â
íåêîòîðûõ ñëó÷àÿõ äî 10 ðàç áûñòðåå). Ïîýòîìó çäåñü ìû áóäåì âåñòè
ðå÷ü òîëüêî î Perl-ñîâìåñòèìûõ ðåãóëÿðíûõ âûðàæåíèÿõ. Êñòàòè,
íåîáõîäèìî çàìåòèòü, ÷òî ïîëíîå îïèñàíèå ñèíòàêñèñà ðåãóëÿðíûõ
âûðàæåíèé, èìåþùååñÿ â PHP Manual, çàíèìàåò áîëåå 50 êèëîáàéò è,
åñòåñòâåííî, çäåñü ìû íå áóäåì ðàññìàòðèâàòü âåñü ñèíòàêñèñ. Íàì
íåîáõîäèìû òîëüêî îñíîâû, êîòîðûå ïîìîãóò âàì ïîíÿòü, êàê èìåííî
ïèøóòñÿ ðåãóëÿðíûå âûðàæåíèÿ.
Ñóòüþ ìåõàíèçìà ðåãóëÿðíûõ âûðàæåíèé ÿâëÿåòñÿ òî, ÷òî îíè
ïîçâîëÿþò çàäàòü øàáëîí äëÿ íå÷åòêîãî ïîèñêà ïî òåêñòó.
Íàïðèìåð, åñëè ïåðåä âàìè ñòîèò çàäà÷à íàéòè â òåêñòå îïðåäåëåííîå
ñëîâî, òî ñ ýòîé çàäà÷àé õîðîøî ñïðàâëÿþòñÿ è îáû÷íûå ôóíêöèè ðàáîòû
ñî ñòðîêàìè. Îäíàêî åñëè âàì íóæíî íàéòè "òî, íå çíàþ ÷òî", î ÷åì âû
ìîæåòå ñêàçàòü òîëüêî òî, êàê ïðèáëèçèòåëüíî ýòî äîëæíî
âûãëÿäåòü - òî çäåñü áåç ðåãóëÿðíûõ âûðàæåíèé ïðîñòî íå îáîéòèñü.
Íàïðèìåð, âàì íåîáõîäèìî íàéòè â òåêñòå èíôîðìàöèþ, ïðî êîòîðóþ âàì
èçâåñòíî òîëüêî òî, ÷òî ýòî "3 èëè 4 öèôðû ïîñëå êîòîðûõ ÷åðåç
ïðîáåë èäåò 5 çàãëàâíûõ ëàòèíñêèõ áóêâ", òî âû ñìîæåòå ñäåëàòü
ýòî î÷åíü ïðîñòî, âîçïîëüçîâàâøèñü ñëåäóþùèì ðåãóëÿðíûì
âûðàæåíèåì: /\d{3,4}\s[A-Z]{5}/
Ñèíòàêñèñ ðåãóëÿðíûõ âûðàæåíèé
Ðåãóëÿðíûå âûðàæåíèÿ, êàê óæå áûëî ñêàçàíî âûøå, ïðåäñòàâëÿþò
ñîáîé ñòðîêó. Ñòðîêà âñåãäà íà÷èíàåòñÿ ñ ñèìâîëà ðàçäåëèòåëÿ, çà
êîòîðûì ñëåäóåò íåïîñðåäñòâåííî ðåãóëÿðíîå âûðàæåíèå, çàòåì åùå îäèí
ñèìâîë ðàçäåëèòåëÿ è ïîòîì íåîáÿçÿòåëüíûé ñïèñîê ìîäèôèêàòîðîâ. Â
êà÷åñòâå ñèìâîëà ðàçäåëèòåëÿ îáû÷íî èñïîëüçóåòñÿ ñëýø
('/'). Òàêèì îáðàçîì â ñëåäóþùåì ðåãóëÿðíîì âûðàæåíèè:
/\d{3}-\d{2}/m, ñèìâîë '/' ÿâëÿåòñÿ
ðàçäåëèòåëåì, ñòðîêà '\d{3}-\d{2}' - íåïîñðåäñòâåííî
ðåãóëÿðíûì âûðàæåíèåì, à ñèìâîë 'm', ðàñïîëîæåííûé
ïîñëå âòîðîãî ðàçäåëèòåëÿ - ýòî ìîäèôèêàòîð.
Îñíîâîé ñèíòàêñèñà ðåãóëÿðíûõ âûðàæåíèé ÿâëÿåòñÿ òîò ôàêò, ÷òî
íåêîòîðûå ñèìâîëû, âñòðå÷àþùèåñÿ â ñòðîêå ðàññìàòðèâàþòñÿ íå êàê
îáû÷íûå ñèìâîëû, à êàê èìåþùèå ñïåöèàëüíîå çíà÷åíèå (ò.í.
ìåòàñèìâîëû). Èìåííî ýòî ðåøåíèå ïîçâîëÿåò ðàáîòàòü
âñåìó ìåõàíèçìó ðåãóëÿðíûõ âûðàæåíèé. Êàæäûé ìåòàñèìâîë èìååò ñâîþ
ñîáñòâåííóþ ðîëü â ñèíòàêñèñå ðåãóëÿðíûõ âûðàæåíèé. Äàëåå ìû
ðàññìîòðèì âñå ýòè ìåòàñèìâîëû.
Îäíèì èç ñàìûõ âàæíûõ ìåòàñèìâîëîâ ÿâëÿåòñÿ ñèìâîë îáðàòíîãî
ñëýøà ('\'). Åñëè â ñòðîêå âñòðå÷àåòñÿ ýòîò ñèìâîë, òî
ïàðñåð ðàññìàòðèâàåò ñèìâîë, íåïîñðåäñòâåííî ñëåäóþùèé çà íèì
äâîÿêî:
- åñëè ñëåäóþùèé ñèìâîë â îáû÷íîì ðåæèìå èìååò êàêîå-ëèáî
ñïåöèàëüíîå çíà÷åíèå, òî îí òåðÿåò ýòî ñâîå ñïåöèàëüíîå çíà÷åíèå è
ðàññìàòðèâàåòñÿ êàê îáû÷íûé ñèìâîë. Ýòî ñîâåðøåííî íåîáõîäèìî äëÿ
òîãî, ÷òîáû èìåòü âîçìîæíîñòü âñòàâëÿòü â ñòðîêó ñïåöèàëüíûå
ñèìâîëû, êàê îáû÷íûå. Íàïðèìåð ìåòàñèìâîë '
.', â
îáû÷íîì ðåæèìå îçíà÷àåò "ëþáîé åäèíè÷íûé ñèìâîë", à
'\.' îçíà÷àåò ïðîñòî òî÷êó. Òàêæå ìîæíî ëèøèòü
ñïåöèàëüíîãî çíà÷åíèÿ è ñàì ýòîò ñèìâîë: '\\'.
- åñëè ñëåäóþùèé ñèìâîë â îáû÷íîì ðåæèìå íå èìååò íèêàêîãî
ñïåöèàëüíîãî çíà÷åíèÿ, òî îí ìîæåò ïîëó÷èòü òàêîå çíà÷åíèå, áóäó÷è
ñîåäèíåííûì ñ ñèìâîëîì '
\'. Ê ïðèìåðó ñèìâîë
'd' â îáû÷íîì ðåæèìå âîñïðèíèìàåòñÿ ïðîñòî êàê áóêâà,
îäíàêî, áóäó÷è ñîåäèíåííîé ñ îáðàòíûì ñëýøåì ('\d')
ñòàíîâèòñÿ ìåòàñèìâîëîì, îçíà÷àþùèì "ëþáàÿ öèôðà".
Ñóùåñòâóåò ìíîæåñòâî ñèìâîëîâ, êîòîðûå îáðàçóþò ìåòàñèìâîëû â
ïàðå ñ îáðàòíûì ñëýøåì. Êàê ïðàâèëî ïîäîáíûå ïàðû èñïîëüçóþòñÿ äëÿ
òîãî, ÷òîáû ïîêàçàòü, ÷òî íà ýòîì ìåñòå â ñòðîêå äîëæåí íàõîäèòüñÿ
ñèìâîë, ñ êîäîì, êîòîðûé íå èìååò ñîîòâåòñòâóþùåãî åìó èçîáðàæåíèÿ
èëè æå ñèìâîë, ïðèíàäëåæàùèé êàêîé-òî îïðåäåëåííîé ãðóïïå ñèìâîëîâ.
Íèæå ïðèâåäåíû íåêîòîðûå íàèáîëåå óïîòðåáèòåëüíûå:
| Ìåòàñèìâîë |
Çíà÷åíèå |
| Ìåòàñèìâîëû äëÿ çàäàíèÿ
ñèìâîëîâ, íå èìåþùèõ èçîáðàæåíèÿ |
\n |
Ñèìâîë ïåðåâîäà ñòðîêè (êîä
0x0A) |
\r |
Ñèìâîë âîçâðàòà êàðåòêè (êîä 0x0D) |
\t |
Ñèìâîë òàáóëÿöèè (êîä 0x09) |
\xhh |
Âñòàâêà ñèìâîëà ñ øåñòíàäöàòèðè÷íûì êîäîì
0xhh, íàïðèìåð \x41 âñòàâèò
ëàòèíñêóþ áóêâó 'A' |
| Ìåòàñèìâîëû äëÿ çàäàíèÿ ãðóïï
ñèìâîëîâ |
\d |
Öèôðà (0-9) |
\D |
Íå öèôðà (ëþáîé ñèìâîë êðîìå ñèìâîëîâ 0-9) |
\s |
Ïóñòîé ñèìâîë (îáû÷íî ïðîáåë è ñèìâîë òàáóëÿöèè) |
\S |
Íåïóñòîé ñèìâîë (âñå, êðîìå ñèìâîëîâ, îïðåäåëÿåìûõ
ìåòàñèìâîëîì \s) |
\w |
"Ñëîâåñíûé" ñèìâîë (ñèìâîë, êîòîðûé èñïîëüçóåòñÿ â ñëîâàõ.
Îáû÷íî âñå áóêâû, âñå öèôðû è çíàê ïîä÷åðêèâàíèÿ
('_')) |
\W |
Âñå, êðîìå ñèìâîëîâ, îïðåäåëÿåìûõ ìåòàñèìâîëîì
\w |
Ñ îñòàëüíûìè èìåþùèìèñÿ ìåòàñèìâîëàìè, ïîñòðîåííûìè ïî ýòîìó
ïðèíöèïó âû ïðè æåëàíèè ñìîæåòå îçíàêîìèòüñÿ â îðèãèíàëüíîì îïèñàíèè.
Ïðèâåäó íåñêîëüêî ïðîñòåéøèõ ïðèìåðîâ äëÿ òîãî, ÷òîáû âû
ïîíèìàëè, î ÷åì èäåò ðå÷ü. Ñðàçó îãîâîðþñü, ÷òî ïðèìåðû íåñêîëüêî
ãðîìîçäêè è íåêðàñèâû, íî ëèøü ïîòîìó, ÷òî ÿ íå ñòàë èñïîëüçîâàòü â
íèõ ìåòàñèìâîëû, î êîòîðûõ åùå íå ðàññêàçàë è êîòîðûå ñäåëàëè áû èõ
íàìíîãî ïðîùå.
| Regexp |
Êîììåíòàðèè |
/\d\d\d/ |
Ëþáîå òðåõçíà÷íîå ÷èñëî ('123',
'719', '001') |
/\w\s\d\d/ |
Áóêâà, ïðîáåë (èëè òàáóëÿöèÿ) è äâóçíà÷íîå ÷èñëî ('A
01', 'z 45', 'S 18') |
/\d and \d/ |
Ëþáàÿ èç ñëåäóþùèõ ñòðîê: '1 and 2', '9
and 5', '3 and 4'. |
Ñèíòàêñèñ ðåãóëÿðíûõ âûðàæåíèé èìååò ñðåäñòâà äëÿ îïðåäåëåíèÿ
ñîáñòâåííûõ ïîäìíîæåñòâ ñèìâîëîâ. Íàïðèìåð âàì ìîæåò ïîíàäîáèòüñÿ
çàäàòü óñëîâèå, ÷òî â ýòîì ìåñòå ñòðîêè äîëæíà íàõîäèòüñÿ
øåñòíàäöàòèðè÷íàÿ öèôðà èëè åùå ÷òî-òî ïîäîáíîå. Äëÿ îïèñàíèÿ òàêèõ
ïîäìíîæåñòâ ïðèìåíÿþòñÿ ñèìâîëû êâàäðàòíûõ ñêîáîê '[]'.
Êâàäðàòíûå ñêîáêè, âñòðå÷åííûå âíóòðè ðåãóëÿðíîãî âûðàæåíèÿ
ñ÷èòàþòñÿ îäíèì ñèìâîëîì, êîòîðûé ìîæåò ïðèíèìàòü çíà÷åíèÿ,
ïåðå÷èñëåííûå âíóòðè ýòèõ ñêîáîê.
Åñòü íåáîëüøàÿ òîíêîñòü â òîì, êàê ðàáîòàþò ìåòàñèìâîëû âíóòðè
êâàäðàòíûõ ñêîáîê. Äåëî â òîì, ÷òî â ñèíòàêñèñå ðåãóëÿðíûõ âûðàæåíèé
ñóùåñòâóåò åùå ìíîæåñòâî ìåòàñèìâîëîâ, íî ïðàêòè÷åñêè âñå îíè
ðàáîòàþò òîëüêî âíå ñåêöèé îïèñàíèé ïîäìíîæåñòâ. Åäèíñòâåííûå
ìåòàñèìâîëû, êîòîðûå ðàáîòàþò âíóòðè ýòèõ ñåêöèé ýòî:
- Îáðàòíûé ñëýø ('
\'). Ò.å. âñå ìåòàñèìâîëû èç
ïðèâåäåííîé ðàíåå òàáëèöû áóäóò ðàáîòàòü.
- Ìèíóñ ('
-'). Èñïîëüçóåòñÿ äëÿ çàäàíèÿ íàáîðà
ñèìâîëîâ èç îäíîãî ïðîìåæóòêà (íàïðèìåð âñå öèôðû ìîãóò áûòü
çàäàíû êàê '0-9')
- Ñèìâîë '
^'. Åñëè ýòîò ñèìâîë ñòîèò ïåðâûì
â ñåêöèè çàäàíèÿ ïîäìíîæåñòâà ñèìâîëîâ (è òîëüêî â ýòîì ñëó÷àå!)
îí áóäåò ðàññìàòðèâàòüñÿ êàê ñèìâîë îòðèöàíèÿ. Ò.î. ìîæíî çàäàòü
âñå ñèâîëû, êîòîðûå íå îïèñàíû â äàííîé ñåêöèè.
Íåñêîëüêî ïðèìåðîâ, ÷òîáû áûëî ïîíÿòíî, êàê ýòî ðàáîòàåò:
| Regexp |
Êîììåíòàðèè |
[0-9A-Fa-f] |
Öèôðà â øåñòíàäöàòèðè÷íîé ñèñòåìå ñ÷èñëåíèÿ |
[\dA-Fa-f] |
Òî æå ñàìîå, íî ñ èñïîëüçîâàíèåì ìåòàñèìâîëà |
[02468] |
×åòíàÿ öèôðà |
[^\d] |
Âñå, êðîìå öèôð (àíàëîã ìåòàñèìâîëà \D) |
[a^b] |
Ëþáîé èç ñèìâîëîâ 'a', 'b',
'^'. Çàìåòüòå, ÷òî çäåñü ñèìâîë '^'
íå èìååò êàêîãî-ëèáî ñïåöèàëüíîãî çíà÷åíèÿ, ïîòîìó ÷òî ñòîèò
íå íà ïåðâîé ïîçèöèè âíóòðè êâàäðàòíûõ
ñêîáîê. |
Òåïåðü íåîáõîäèìî ðàññìîòðåòü åùå íåñêîëüêî ìåòàñèìâîëîâ. Êàê óæå
áûëî ñêàçàíî ðàíåå, âñå îíè ðàáîòàþò òîëüêî âíå ñåêöèé îïèñ÷àíèé
ïîäìíîæåñòâ ñèìâîëîâ (âíå êâàäðàòíûõ ñêîáîê).
Ñèìâîëû '^' è '$'. Îíè èñïîëüçóòñÿ äëÿ
òîãî, ÷òî òîãî, ÷òîáû óêàçàòü ïàðñåðó ðåãóëÿðíûõ âûðàæåíèé íà òî,
÷òîáû îí îáðàòèë âíèìàíèå íà ïîëîæåíèå èñêîìîãî òåêñòà â ñòðîêå.
Ñèìâîë '^' óêàçûâàåò, ÷òî èñêîìûé òåêñò äîëæåí
íàõîäèòüñÿ â íà÷àëå ñòðîêè, ñèìâîë '$' íàîáîðîò,
óêàçûâàåò, ÷òî èñêîìûé òåêñò äîëæåí íàõîäèòüñÿ â êîíöå ñòðîêè.
Ïîñìîòðèì, êàê ýòî ðàáîòàåò íà ïðèìåðå:
Äîïóñòèì, ó íàñ åñòü òåêñò: 12 aaa bbb
aaa 27 ccc
aaa aaa 45
È ðåãóëÿðíîå âûðàæåíèå äëÿ ïîèñêà ÷èñåë â ýòîì òåêñòå:
/\d\d/m (íå îáðàùàéòå ïîêà âíèìàíèÿ íà ìîäèôèêàòîð).
Ïîèñê ïî ýòîìó ðåãóëÿðíîìó âûðàæåíèþ âåðíåò íàì 3 çíà÷åíèÿ:
'12', '27', '45'. Òåïåðü
îãðàíè÷èì ïîèñê, óêàçàâ, ãäå èìåííî âíóòðè ñòðîêè äîëæåí
ðàñïîëàãàòüñÿ òåêñò: /^\d\d/m. Çäåñü ðåçóëüòàò áóäåò
òîëüêî îäèí - '12', ïîòîìó ÷òî òîëüêî ýòî ÷èñëî
ðàñïîëàãàåòñÿ â íà÷àëå ñòðîêè. Àíàëîãè÷íî, ðåãóëÿðíîå âûðàæåíèå
/\d\d$/m âåðíåò ðåçóëüòàò '45'.
Ñèìâîë òî÷êè '.'. Ýòîò ìåòàñèìâîë óêàçûâàåò, ÷òî íà
äàííîì ìåñòå â ñòðîêå ìîæåò íàõîäèòüñÿ ëþáîé ñèìâîë (çà èñêëþ÷åíèåì
ñèìâîëà ïåðåâîäà ñòðîêè). Î÷åíü óäîáíî èñïîëüçîâàòü åãî, åñëè âàì
íóæíî "ïðîïóñòèòü" êàêóþ-íèáóäü áóêâó â ñëîâå ïðè ïðîâåðêå. Íàïðèìåð
ðåãóëÿðíîå âûðàæåíèå /.bc/ íàéäåò â òåêñòå è
'abc' è 'Abc' è 'Zbc' è
'5bc'.
Ñèìâîë âåðòèêàëüíîé ÷åðòû ' '. Èñïîëüçóåòñÿ äëÿ
çàäàíèÿ ñïèñêà àëüòåðíàòèâ. Íàïðèìåð ðåãóëÿðíîå âûðàæåíèå: /(êðàñíîå çåëåíîå) ÿáëîêî/
Íàéäåò â òåêñòå âñå ñëîâîñî÷åòàíèÿ 'êðàñíîå ÿáëîêî'
è 'çåëåíîå ÿáëîêî'. Î çíà÷åíèè êðóãëûõ ñêîáîê â ýòîì
âûðàæåíèè ñì. äàëåå.
Ñèìâîëû êðóãëûõ ñêîáîê '(' è ')'. Ýòè
ñèìâîëû ïîçâîëÿþò ïîëó÷èòü èç èñêîìîé ñòðîêè äîïîëíèòåëüíóþ
èíôîðìàöèþ. Îáû÷íî, åñëè ïàðñåð ðåãóëÿðíûõ âûðàæåíèé èùåò â òåêñòå
èíôîðìàöèþ ïî çàäàííîìó âûðàæåíèþ è íàõîäèò åå - îí ïðîñòî
âîçâðàùàåò íàéäåííóþ ñòðîêó. Îäíàêî, åñëè îí âñòðå÷àåò âíóòðè
ðåãóëÿðíîãî âûðàæåíèÿ êðóãëûå ñêîáêè, òî îí ðàññìàòðèâàåò ñîäåðæèìîå
ýòèõ ñêîáîê êàê åùå îäíî ðåãóëÿðíîå âûðàæåíèå, ïî êîòîðîìó
íåîáõîäèìî ïðîèçâåñòè ïîèñê. Ïàðñåð ðåêóðñèâíî âûçûâàåò ñàì ñåáÿ äëÿ
ïîèñêà ïî íîâîìó ðåãóëÿðíîìó âûðàæåíèþ è èñïîëüçóåò ðåçóëüòàòû
ïîèñêà äëÿ äàëüíåéøåé îáðàáîòêè îñíîâíîãî ðåãóëÿðíîãî âûðàæåíèÿ. Ïðè
ýòîì, åñëè ïîèñê õîòÿ áû ïî îäíîìó èç âíóòðåííèõ ðåãóëÿðíûõ
âûðàæåíèé íå óâåí÷àëñÿ óñïåõîì - ïîèñê ïî âñåìó ðåãóëÿðíîìó
âûðàæåíèþ ñ÷èòàåòñÿ áåçóñïåøíûì.
×òîáû áûëî ïîíÿòíåå, î ÷åì ÿ òîëüêî ÷òî ðàññêàçàë - ðàññìîòðèì â
êà÷åñòâå ïðèìåðà òî, êàê ðàáîòàåò ïàðñåð ðåãóëÿðíûõ âûðàæåíèé â
ñëó÷àå ïðèâåäåííîãî âûøå ðåãóëÿðíîãî âûðàæåíèÿ î ÿáëîêàõ:
/(êðàñíîå çåëåíîå) ÿáëîêî/.
- Ïàðñåð íà÷èíàåò ðàçáîð ðåãóëÿðíîãî âûðàæåíèÿ è âñòðå÷àåò
âûðàæåíèå â ñêîáêàõ:
(êðàñíîå çåëåíîå)
- Ïàðñåð âûçûâàåò ñåáÿ äëÿ ïîèñêà ïî íàéäåííîìó ðåãóëÿðíîìó
âûðàæåíèþ
- Ïîëó÷èâ ðåçóëüòàòû ïîèñêà ïàðñåð ïîäñòàâëÿåò ïî î÷åðåäè êàæäûé
èç ïîëó÷åííûõ ðåçóëüòàòîâ íà ìåñòî âûðàæåíèÿ â ñêîáêàõ è ñìîòðèò,
óäîâëåòâîðÿåò ëè íàéäåííûé ðåçóëüòàò âñåì óñëîâèÿì îñíîâíîãî
ðåãóëÿðíîãî âûðàæåíèÿ (â äàííîì ñëó÷àå ñìîòðèò, åñòü ëè ïîñëå
íàéäåííîãî ñëîâà ñëîâî "
ÿáëîêî").
- Åñëè âñå â ïîðÿäêå - ðåçóëüòàòû ïîèñêà ïî êàæäîìó èç èìåþùèõñÿ
ðåãóëÿðíûõ âûðàæåíèé äëÿ ýòîãî ñëó÷àÿ âîçâðàùàþòñÿ, åñëè íåò -
ïàðñåð ïðîñòî ïåðåõîäèò ê ñëåäóþùåìó íàéäåííîìó ôðàãìåíòó.
Ðåçóëüòàò ïîèñêà âíóòðåííåãî ðåãóëÿðíîãî âûðàæåíèÿ äëÿ ýòîãî
ôðàãìåíòà ïðè ýòîì òåðÿåòñÿ.
 êà÷åñòâå ïðèìåðà âîçüìåì ñòðîêó: ÿáëîêî êðàñíîå è çåëåíîå ÿáëîêî è åùå îäíî êðàñíîå ÿáëîêî è åùå îäíî ÿáëîêî, çåëåíîå
Ïîèñê ïî âíóòðåííåìó ðåãóëÿðíîìó âûðàæåíèþ äàñò 4 ðåçóëüòàòà
(âûäåëåíû æèðíûì øðèôòîì): ÿáëîêî êðàñíîå è çåëåíîå ÿáëîêî è åùå îäíî êðàñíîå ÿáëîêî è åùå îäíî ÿáëîêî, çåëåíîå
Îäíàêî ïîèñê ïî âñåìó ðåãóëÿðíîìó âûðàæåíèþ äàñò âñåãî 2
ðåçóëüòàòà, ïîòîìó êàê â îñòàëüíûõ ñëó÷àÿõ óñëîâèÿ îñíîâíîãî
ðåãóëÿðíîãî âûðàæåíèÿ íå âûïîëíÿþòñÿ: ÿáëîêî êðàñíîå è çåëåíîå ÿáëîêî è åùå îäíî êðàñíîå ÿáëîêî è åùå îäíî ÿáëîêî, çåëåíîå
Íåîáõîäèìî çàìåòèòü, ÷òî äëÿ ýòèõ äâóõ ñëó÷àåâ áóäåò âîçâðàùåí íå
òîëüêî ðåçóëüòàò ïîèñêà ïî îñíîâíîìó ðåãóëÿðíîìó âûðàæåíèþ, íî è
ðåçóëüòàò ïîèñêà ïî âíóòðåííåìó ðåãóëÿðíîìó âûðàæåíèþ äëÿ êàæäîãî èç
íàéäåííûõ ôðàãìåíòîâ.  áîëüøèíñòâå ñëó÷àåâ ýòî ïîëåçíî (ïðèìåð -
÷óòü ïîçäíåå), íî èíîãäà íàîáîðîò, ëó÷øå èçáàâèòüñÿ îò ëèøíèõ
ðåçóëüòàòîâ.  ýòîì ñëó÷àå íåîáõîäèìî äîáàâèòü ñèìâîëû
'?:' íåïîñðåäñòâåííî ïîñëå îòêðûâàþùåéñÿ êðóãëîé
ñêîáêè: /(?:êðàñíîå çåëåíîå) ÿáëîêî/.
Òåïåðü ïðèìåð, êîãäà ïîëó÷åíèå ðåçóëüòàòîâ âíóòðåííèõ ðåãóëÿðíûõ
âûðàæåíèé ìîæåò áûòü ïîëåçíûì. Äîïóñòèì, íàì íåîáõîäèìî ïðîâåðèòü,
ÿâëÿåòñÿ ëè ñòðîêà ñåìèçíà÷íûì òåëåôîííûì íîìåðîì ñ óêàçàíèåì êîäà
ãîðîäà è ïîëó÷èòü èç íåå êîä ãîðîäà è íîìåð òåëåôîíà: /\((\d{3,5})\)\s+(\d{3}-\d{2}-\d{2})/
Íåêîòîðûå èç ïðèìåíåííûõ çäåñü ìåòàñèìâîëîâ âàì åùå íåèçâåñòíû è
áóäóò ðàññìîòðåíû ÷óòü ïîçäíåå. Äàâàéòå ðàññîòðèì ýòîò regexp
ïîäðîáíåå.
Ïåðâàÿ êðóãëàÿ ñêîáêà çäåñü òåðÿåò ñâîå ñïåöèàëüíîå çíà÷åíèå è
áóäåò ðàññìàòðèâàòüñÿ êàê îáû÷íûé ñèìâîë: /\((\d{3,5})\)\s+(\d{3}-\d{2}-\d{2})/
Äàëåå èäåò ðåãóëÿðíîå âûðàæåíèå â ñêîáêàõ (ïðîâåðêà êîäà
ãîðîäà): /\((\d{3,5})\)\s+(\d{3}-\d{2}-\d{2})/
Ïîñëå ýòîãî èäåò çàêðûâàþùàÿ êðóãëàÿ ñêîáêà, êîòîðàÿ òàêæå ëèøåíà
ñâîåãî ñïåöèàëüíîãî çíà÷åíèÿ èç-çà ñèìâîëà îáðàòíîãî ñëýøà, ñòîÿùåãî
ïåðåä íåé: /\((\d{3,5})\)\s+(\d{3}-\d{2}-\d{2})/
Çàòåì èäåò ïðîïóñê ïóñòîãî ìåñòà: /\((\d{3,5})\)\s+(\d{3}-\d{2}-\d{2})/
È åùå îäíî ðåãóëÿðíîå âûðàæåíèå â ñêîáêàõ, êîòîðîå ïðîâåðÿåò
íîìåð òåëåôîíà: /\((\d{3,5})\)\s+(\d{3}-\d{2}-\d{2})/
Êàê âèäèòå, çäåñü åñòü 3 ðåãóëÿðíûõ âûðàæåíèÿ - îñíîâíîå è äâà
âíóòðåííèõ. Ïðè ýòîì îñíîâíîå âûðàæåíèå ïîçâîëÿåò íàì ïðîâåðèòü,
èìååò ëè ñòðîêà íåîáõîäèìûé íàì ôîðìàò, à äâà âíóòðåííèõ - ïîëó÷èòü
ñîîòâåòñòâåííî êîä ãîðîäà è íîìåð òåëåôîíà. Ò.å. îäíèì ðåãóëÿðíûì
âûðàæåíèåì ìû ìîæåì ðåøèòü ñðàçó íåñêîëüêî çàäà÷!
Ïîñìîòðèì, êàê ðàáîòàåò ýòî ðåãóëÿðíîå âûðàæåíèå. Ïóñòü ó íàñ
åñòü ñòðîêà: "My phone is (095) 123-45-67".
Ðåçóëüòàòàìè ïîèñêà áóäóò 3 ñòðîêè: '(095) 123-45-67',
'095' è '123-45-67'.
Íàì îñòàëîñü ðàññìîòðåòü åùå îäíó ãðóïïó ìåòàñèìâîëîâ,
îïðåäåëÿþùèõ êîëè÷åñòâåííûå ïîêàçàòåëè (ò.í.
quantifiers). Êàê âû óæå ìîãëè çàìåòèòü ðàíåå - î÷åíü
÷àñòî áûâàåò íåîáõîäèìî óêàçàòü, ÷òî êàêîé-òî ñèìâîë äîëæåí
ïîâòîðÿòüñÿ îïðåäåëåííîå êîëè÷åñòâî ðàç. Êîíå÷íî, ìîæíî ïðîñòî
óêàçàòü åãî íåîáõîäèìîå êîëè÷åñòâî ðàç íåïîñðåäñòâåííî â ñòðîêå, íî
ýòî, åñòåñòâåííî íå âûõîä. Òåì áîëåå, ÷òî î÷åíü ÷àñòî âñòðå÷àþòñÿ
ñèòóàöèè, êîãäà òî÷íîå êîëè÷åñòâî ñèìâîëîâ íåèçâåñòíî. Ïîýòîìó
ñèíòàêñèñ ðåãóëÿðíûõ âûðàæåíèé ñîäåðæèò íàáîð ìåòàñèìâîëîâ,
ïðåäíàçíà÷åííûõ èìåííî äëÿ ðåøåíèÿ ïîäîáíûõ çàäà÷. Êàæäûé èç
îïèñàííûõ íèæå ìåòàñèìâîëîâ îïðåäåëÿåò êîëè÷åñòâåííóþ õàðàêòåðèñòèêó
ñèìâîëà êîòîðûé íàõîäèòñÿ íåïîñðåäñòâåííî ïåðåä íèì.
Çâåçäî÷êà '*'. Óêàçûâàåò, ÷òî ñèìâîë äîëæåí áûòü
ïîâòîðåí 0 èëè áîëåå ðàç (ò.å. ñèìâîë ìîæåò îòñóòñòâîâàòü èëè
ïðèñóòñòâîâàòü â ëþáûõ êîëè÷åñòâàõ). Ïðèìåð: âûðàæåíèå
/ab*c/ íàéäåò ñòðîêè 'ac',
'abc', 'abbc' è ò.ä.
Ïëþñ '+'. Óêàçûâàåò, ÷òî ñèìâîë äîëæåí áûòü ïîâòîðåí
1 èëè áîëåå ðàç (ò.å. ñèìâîë îáÿçàí ïðèñóòñòâîâàòü è ìîæåò
ïðèñóòñòâîâàòü â ëþáûõ êîëè÷åñòâàõ). Ïðèìåð: âûðàæåíèå
/ab+c/ íàéäåò ñòðîêè 'abc',
'abbc', 'abbbc' è ò.ä., íî íå íàéäåò
ñòðîêó 'ac'.
Çíàê âîïðîñà '?'. Óêàçûâàåò, ÷òî ñèìâîë ìîåò êàê
ïðèñóòñòâîâàòü, òàê è íåò, íî ïðè ýòîì íå ìîæåò ïîâòîðÿòüñÿ áîëåå
îäíîãî ðàçà. Ïðèìåð: âûðàæåíèå /ab?c/ íàéäåò ñòðîêè
'ac' è 'abc', íî íå íàéäåò ñòðîêó
'abbc'.
Ôèãóðíûå ñêîáêè '{' è '}'. Îïðåäåëÿþò
êîëè÷åñòâåííóþ õàðàêòåðèñòèêó ñèìâîëà. Âíóòðè ñêîáîê ÷åðåç çàïÿòóþ
ïåðå÷èñëÿþòñÿ ìèíèìàëüíîå è ìàêñèìàëüíîå êîëè÷åñòâî ïîâòîðåíèé
ñèìâîëà. Ïðè ýòîì ëþáîé èç ïàðàìåòðîâ ìîæåò áûòü îïóùåí, à êðîìå
òîãî ìîæíî çàäàòü òî÷íîå êîëè÷åñòâî ïîâòîðåíèé, óêàçàâ òîëüêî îäíî
÷èñëî. Ïðèìåðû:
{2,4} - ñèìâîë äîëåí ïîâòîðèòüñÿ ìèíèìóì 2 ðàçà,
íî íå áîëåå 4.
{,5} - ñèìâîë ìîæåò îòñóòñòâîâàòü (ò.ê. íå çàäàíî
ìèíèìàëüíîå êîëè÷åñòâî ïîâòîðåíèé), íî åñëè ïðèñóòñòâóåò, òî íå
äîëæåí ïîâòîðÿòüñÿ áîëåå 5 ðàç.
{3,} - ñèìâîë äîëæåí ïîâòîðÿòüñÿ ìèíèìóì 3 ðàçà,
íî ìîæåò áûòü è áîëüøå.
{4} - ñèìâîë äîëæåí ïîâòîðÿòüñÿ ðîâíî 4 ðàçà
Åñòü åùå îäíà òîíêîñòü â èñïîëüçîâàíèè ìåòàñèìâîëà
'?'. Ïîñìîòðèòå íà òàêîå âûðàæåíèå: /.+a/.
Îæèäàåòñÿ, ÷òî îíî âåðíåò íàì ÷àñòü òåêñòà äî ïåðâîãî âõîæäåíèÿ
ñèìâîëà 'a' â ýòîò òåêñò. Íà ñàìîì äåëå îíî áóäåò
ðàáîòàòü íåñêîëüêî íå òàê, êàê îæèäàåòñÿ è ðåçóëüòàòîì ïîèñêà áóäåò
âåñü òåêñò äî ïîñëåäíåãî âõîæäåíèÿ ñèìâîëà 'a'.
Äåëî â òîì, ÷òî ïî óìîë÷àíèþ êîëè÷åñòâåííûå ìåòàñèìâîëû "æàäíè÷àþò"
è ïûòàþòñÿ çàõâàòèòü êàê ìîæíî áîëüøèé êóñîê òåêñòà. Åñëè ýòî íå
íóæíî (êàê à íàøåì ñëó÷àå), òî íåîáõîäèìî "îòó÷èòü" èõ îò æàäíîñòè,
óêàçàâ çíàê '?' ïîñëå êîëè÷åñòâåííîãî ìåòàñèìâîëà:
/.+?a/. Ïîñëå ýòîãî âûðàæåíèå áóäåò ðàáîòàòü òàê êàê
íàäî.
Ìîäèôèêàòîðû ðåãóëÿðíûõ âûðàæåíèé
Êàê óæå áûëî ñêàçàíî ðàíåå - ìåõàíèçì ðåãóëÿðíûõ âûðàæåíèé
ïîçâîëÿåò äîáàâëÿòü ìîäèôèêàòîðû, âëèÿþùèå íà îáðàáîòêó ðåãóëÿðíîãî
âûðàæåíèÿ. Íèæå ðàññìîòðåíû íàèáîëåå óïîòðåáèòåëüíûå, îá îñòàëüíûõ
âû ìîæåòå ïðî÷èòàòü â îðèãèíàëüíîì îïèñàíèè.
| Ìîäèôèêàòîð |
Çíà÷åíèå |
| i |
Âêëþ÷åíèå ðåæèìà case-insensitive, ò.å. áîëüøèå è
ìàëåíüêèå áóêâû â âûðàæåíèè íå ðàçëè÷àþòñÿ. |
| m |
Óêàçûâàåò íà òî, ÷òî òåêñò, ïî êîòîðîìó âåäåòñÿ ïîèñê,
äîëæåí ðàññìàòðèâàòüñÿ êàê ñîñòîÿùèé èç íåñêîëüêèõ ñòðîê. Ïî
óìîë÷àíèþ ìåõàíèçì ðåãóëÿðíûõ âûðàæåíèé ðàññìàòðèâàåò òåêñò
êàê îäíó ñòðîêó âíå çàâèñèìîñòè îò òîãî, ÷åì îíà ÿâëÿåòñÿ íà
ñàìîì äåëå. Ñîîòâåòñòâåííî ìåòàñèìâîëû '^' è
'$' óêàçûâàþò íà íà÷àëî è êîíåö âñåãî òåêñòà.
Åñëè æå ýòîò ìîäèôèêàòîð óêàçàí, òî îíè áóäóò óêàçûâàòü
ñîîòâåòñòâåííî íà íà÷àëî è êîíåö êàæäîé ñòðîêè òåêñòà. |
| s |
Ïî óìîë÷àíèþ ìåòàñèìâîë '.' íå âêëþ÷àåò â
ñâîå îïðåäåëåíèå ñèìâîë ïåðåâîäà ñòðîêè. Ò.å. äëÿ
ìíîãîñòðî÷íîãî òåêñòà âûðàæåíèå /.+/ âåðíåò
òîëüêî ïåðâóþ ñòðîêó, à íå âåñü òåêñò, êàê îæèäàåòñÿ. Óêàçàíèå
ýòîãî ìîäèôèêàòîðà ñíèìàåò ýòî îãðàíè÷åíèå. |
| U |
Äåëàåò âñå êîëè÷åñòâåííûå ìåòàñèìâîëû "íå æàäíûìè" ïî
óìîë÷àíèþ (ïðî "æàäíîñòü" êîëè÷åñòâåííûõ ìåòàñèìâîëîâ ñì.
âûøå) |
Çàêëþ÷åíèå
Íà ýòîì ìû çàêàí÷èâàåì ðàññìîòðåíèå ñèíòàêñèñà ðåãóëÿðíûõ
âûðàæåíèé, íî òåìà åùå íå çàêîí÷åíà.  ñëåäóþùåì âûïóñêå ìû
ðàññìîòðèì âîïðîñû òîãî, êàê PHP ðàáîòàåò ñ ðåãóëÿðíûìè âûðàæåíèÿìè,
à òàêæå ðàññìîòðèì íåêîòîðûå ïðàêòè÷åñêèå ïðèìåðû èñïîëüçîâàíèÿ
ðåãóëÿðíûõ âûðàæåíèé â âàøèõ ïðîãðàììàõ. |