Ââåäåíèå â ðåãóëÿðíûå âûðàæåíèÿ. Ñèíòàêñèñ

Òóò ðåìîíò iphone 8 plus äåëàþò îïûòíûå ìàñòåðà.

Ââåäåíèå â ðåãóëÿðíûå âûðàæåíèÿ. Ñèíòàêñèñ.

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'.

Ñèìâîë âåðòèêàëüíîé ÷åðòû ' '. Èñïîëüçóåòñÿ äëÿ çàäàíèÿ ñïèñêà àëüòåðíàòèâ. Íàïðèìåð ðåãóëÿðíîå âûðàæåíèå:

/(êðàñíîå çåëåíîå) ÿáëîêî/

Íàéäåò â òåêñòå âñå ñëîâîñî÷åòàíèÿ 'êðàñíîå ÿáëîêî' è 'çåëåíîå ÿáëîêî'. Î çíà÷åíèè êðóãëûõ ñêîáîê â ýòîì âûðàæåíèè ñì. äàëåå.

Ñèìâîëû êðóãëûõ ñêîáîê '(' è ')'. Ýòè ñèìâîëû ïîçâîëÿþò ïîëó÷èòü èç èñêîìîé ñòðîêè äîïîëíèòåëüíóþ èíôîðìàöèþ. Îáû÷íî, åñëè ïàðñåð ðåãóëÿðíûõ âûðàæåíèé èùåò â òåêñòå èíôîðìàöèþ ïî çàäàííîìó âûðàæåíèþ è íàõîäèò åå - îí ïðîñòî âîçâðàùàåò íàéäåííóþ ñòðîêó. Îäíàêî, åñëè îí âñòðå÷àåò âíóòðè ðåãóëÿðíîãî âûðàæåíèÿ êðóãëûå ñêîáêè, òî îí ðàññìàòðèâàåò ñîäåðæèìîå ýòèõ ñêîáîê êàê åùå îäíî ðåãóëÿðíîå âûðàæåíèå, ïî êîòîðîìó íåîáõîäèìî ïðîèçâåñòè ïîèñê. Ïàðñåð ðåêóðñèâíî âûçûâàåò ñàì ñåáÿ äëÿ ïîèñêà ïî íîâîìó ðåãóëÿðíîìó âûðàæåíèþ è èñïîëüçóåò ðåçóëüòàòû ïîèñêà äëÿ äàëüíåéøåé îáðàáîòêè îñíîâíîãî ðåãóëÿðíîãî âûðàæåíèÿ. Ïðè ýòîì, åñëè ïîèñê õîòÿ áû ïî îäíîìó èç âíóòðåííèõ ðåãóëÿðíûõ âûðàæåíèé íå óâåí÷àëñÿ óñïåõîì - ïîèñê ïî âñåìó ðåãóëÿðíîìó âûðàæåíèþ ñ÷èòàåòñÿ áåçóñïåøíûì.

×òîáû áûëî ïîíÿòíåå, î ÷åì ÿ òîëüêî ÷òî ðàññêàçàë - ðàññìîòðèì â êà÷åñòâå ïðèìåðà òî, êàê ðàáîòàåò ïàðñåð ðåãóëÿðíûõ âûðàæåíèé â ñëó÷àå ïðèâåäåííîãî âûøå ðåãóëÿðíîãî âûðàæåíèÿ î ÿáëîêàõ: /(êðàñíîå çåëåíîå) ÿáëîêî/.

  1. Ïàðñåð íà÷èíàåò ðàçáîð ðåãóëÿðíîãî âûðàæåíèÿ è âñòðå÷àåò âûðàæåíèå â ñêîáêàõ: (êðàñíîå çåëåíîå)
  2. Ïàðñåð âûçûâàåò ñåáÿ äëÿ ïîèñêà ïî íàéäåííîìó ðåãóëÿðíîìó âûðàæåíèþ
  3. Ïîëó÷èâ ðåçóëüòàòû ïîèñêà ïàðñåð ïîäñòàâëÿåò ïî î÷åðåäè êàæäûé èç ïîëó÷åííûõ ðåçóëüòàòîâ íà ìåñòî âûðàæåíèÿ â ñêîáêàõ è ñìîòðèò, óäîâëåòâîðÿåò ëè íàéäåííûé ðåçóëüòàò âñåì óñëîâèÿì îñíîâíîãî ðåãóëÿðíîãî âûðàæåíèÿ (â äàííîì ñëó÷àå ñìîòðèò, åñòü ëè ïîñëå íàéäåííîãî ñëîâà ñëîâî "ÿáëîêî").
  4. Åñëè âñå â ïîðÿäêå - ðåçóëüòàòû ïîèñêà ïî êàæäîìó èç èìåþùèõñÿ ðåãóëÿðíûõ âûðàæåíèé äëÿ ýòîãî ñëó÷àÿ âîçâðàùàþòñÿ, åñëè íåò - ïàðñåð ïðîñòî ïåðåõîäèò ê ñëåäóþùåìó íàéäåííîìó ôðàãìåíòó. Ðåçóëüòàò ïîèñêà âíóòðåííåãî ðåãóëÿðíîãî âûðàæåíèÿ äëÿ ýòîãî ôðàãìåíòà ïðè ýòîì òåðÿåòñÿ.

 êà÷åñòâå ïðèìåðà âîçüìåì ñòðîêó:

ÿáëîêî êðàñíîå è çåëåíîå ÿáëîêî è åùå îäíî êðàñíîå ÿáëîêî è åùå îäíî ÿáëîêî, çåëåíîå

Ïîèñê ïî âíóòðåííåìó ðåãóëÿðíîìó âûðàæåíèþ äàñò 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 ðàáîòàåò ñ ðåãóëÿðíûìè âûðàæåíèÿìè, à òàêæå ðàññìîòðèì íåêîòîðûå ïðàêòè÷åñêèå ïðèìåðû èñïîëüçîâàíèÿ ðåãóëÿðíûõ âûðàæåíèé â âàøèõ ïðîãðàììàõ.


Jurhen aka Þðèé Ñòàðøèíîâ
webcorp.ru



Ïðè ïåðåïå÷àòêå èíôîðìàöèè äåëàéòå, ïîæàëóéñòà, ññûëêó íà íàø ñàéò (ëèáî ïîäåëèòüñÿ âêîíòàêòå, ãóãë+ èëè äåëèòåñü â îäíîêëàññíèêàõ ñòàòü¸é). Ñïàñèáî!

Èñòî÷íèê: www.wr-script.ru©, 2004-2026ã.

Äåëèòåñü ñ äðóçüÿìè â ñîöñåòÿõ. Àêòèâíûå êîììåíòàòîðû ïîëó÷àþò ñâåæèå ñêðèïòû è áåñïëàòíûå äîðàáîòêè îò WR-Script.ru!

Âåðíóòüñÿ ê ñòàòüÿì ïîìîùè WEB-ìàñòåðó

WR-Счётчик