Warning: include(../header_bottom.php) [function.include]: failed to open stream: No such file or directory in /podrecznik/TB_regx_advsy_cnd.php on line 1
podręcznik

Wyrażenia regularne w programie The Bat!

Obsługa formularzy Wstęp

Tłumaczenie i opracowanie: Zygmunt Wereszczyński <zygawer@thebat.pl>

Składnia wyrażeń regularnych - informacje zaawansowane

Podstawy składni wyrażeń regularnych Wyrażenia regularne w programie The Bat!

Podwyrażenia warunkowe

Podwyrażenia blokujące Składnia wyrażeń regularnych - informacje zaawansowane Komentarze

Możliwe jest takie działanie PCRE, żeby proces dopasowywania warunkowo pomijał jakieś podwyrażenie lub wybierał jedno z dwóch alternatywnych - zależnie od wyniku działania zakotwiczenia lub od wyniku dopasowania wcześniej porównywanych podwyrażeń. Dwie postacie takich podwyrażeń zapisuje się następująco:

(?(warunek)podwyrażenie_T)
(?(warunek)podwyrażenie_T|podwyrażenie_N)

Jeżeli warunek będzie spełniony, to będzie użyte podwyrażenie_T, a w przeciwnym wypadku podwyrażenie_N (jeśli zostało podane). Jeżeli w podwyrażeniu warunkowym znajdzie się więcej niż dwie alternatywy, to podczas jego kompilacji wystąpi błąd.

Rozróżnia się dwa rodzaje warunków. Jeżeli tekst w nawiasach składa się z sekwencji cyfr (reprezentujących pewien numer), to warunek będzie spełniony wówczas, gdy wyrażenie przechwytujące o tym numerze zostało wcześniej dopasowane do napisu. Rozważmy jako przykład podane niżej wyrażenie (spacje zastosowano w celu zwiększenia czytelności i założono, że opcja PCRE_EXTENDED została włączona), dzieląc je dla ułatwienia analizy na trzy części:

( \( )? [^()]+ (?(1) \) )

Pierwsza część pasuje do nawiasu otwierającego opcjonalnie podanego w napisie. Jeżeli taki nawias istnieje, to będzie on traktowany jako pierwszy przechwycony element napisu. Druga część pasuje do jednego lub większej liczby znaków, które nie są nawiasami. Trzecia część jest właśnie podwyrażeniem warunkowym, sprawdzającym wynik dopasowania zawartości pierwszej pary nawiasów. Jeżeli wynik tego testu był pomyślny, tzn. jeżeli badany napis rozpoczynał się od nawiasu, to warunek jest prawdziwy i dalej następują porównania z opisanym wyżej podwyrażeniem_T - a więc wymagany jest nawias zamykający. W przeciwnym wypadku, ponieważ brak jest tu podwyrażenia_N, pierwsze podwyrażenie nie pasuje do niczego. Inaczej mówiąc, podane wyżej przykładowe wyrażenie pasuje do sekwencji znaków nie będących nawiasami, zamkniętej opcjonalnie w nawiasy.

Jeżeli warunek nie jest sekwencją cyfr, to musi być zakotwiczeniem. Może to być dowolne zakotwiczenie (mające dać pomyślny lub niepomyślny wynik, działające wstecz lub w przód). Rozważmy teraz inne wyrażenie, również zawierające nieznaczące spacje (w celu zwiększenia czytelności) i dwie alternatywy podane w drugim wierszu:

(?(?=[^a-z]*[a-z])
\d{2}[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} )

Warunek jest tutaj zakotwiczeniem działającym w przód, po którym spodziewamy się pomyślnego wyniku porównań. Pasuje on do opcjonalnej sekwencji znaków nie będących literami, za którymi następuje litera, czyli inaczej mówiąc - badana jest tu obecność co najmniej jednej litery w porównywanym napisie. Jeżeli taka litera zostanie znaleziona, to napis jest porównywany ponownie z pierwszą alternatywą, w przeciwnym wypadku do porównań zostanie użyta druga alternatywa. Podane wyżej wyrażenie pasuje więc do dwóch rodzajów napisów: "dd-aaa-dd" albo "dd-dd-dd", w których "aaa" są literami, a "dd" cyframi.


Copyright © 1995-2003 RITLABS S.R.L. Wszelkie prawa zastrzeżone.


Warning: include(../footer_bottom.php) [function.include]: failed to open stream: No such file or directory in /podrecznik/TB_regx_advsy_cnd.php on line 51