Jesteś tutaj: Główna → Wyrażenia regularne → Alternatywy i kolejność priorytetów
Jak wiadomo, mechanizm dopasowywania wzorców umożliwia przeszukiwanie tekstu pod kątem kilku – określonych przez użytkownika – wariantów; ze względu jednak na fakt, że warianty te różnią się między sobą co najwyżej jednym znakiem, rozwiązanie to znajduje zastosowanie jedynie w niektórych przypadkach.
W ogólnym przypadku lepiej użyć alternatywy |. Przykładowo, kocha|lubi|szanuje dopasuje jeden z trzech wyrazów kocha, lubi albo szanuje. Kolejne przykłady:
z|d|r|ąbDopasuje ciągi znaków z, d, r albo ąb.
(z|d|r)ąbDopasuje słowa ząb, dąb albo rąb, a literę (z, d albo r) zapamięta w zmiennej \1.
(?:z|d|r)ąbRobi to, co wyrażenie w przykładzie wyżej, ale nie zapamiętuje litery w zmiennej \1.
Mechanizm dopasowuje wyrazy alternatywy po kolei, to znaczy wpierw dopasowywany jest pierwszy wyraz alternatywy, następnie drugi i kolejne. Oznacza to, że niezależnie od tego, do jakiego napisu wzorzec czar|czarodziej będzie przyrównywany, mechanizm dopasuje słowo czar (nawet jeśli mechanizm działa na napisie czarodziej!). Rozwiązaniem w tej sytuacji jest zmiana kolejności wyrazów alternatywie na czarodziej|czar.
Mechanizm nie zadziała zgodnie z oczekiwaniami, gdy napiszesz ^mały|średni|duży$ – wyrażenie to nie znajdzie linii, składających się jedynie ze słów mały, średni czy też duży. Znajdzie ono za to linie, w których słowo mały jest umiejscowione na początku, słowo średni w dowolnym jej miejscu, a duży na końcu linii. Innymi słowy – mechanizm bierze wpierw pod uwagę asercje, a potem dopiero alternatywę. Prowadzi nas to automatycznie do następnego zagadnienia, związanego z wyrażeniami regularnymi, jakim jest…
Bardzo ważne jest posiadanie świadomości, że pewne elementy wyrażeń regularnych mają większą wagę od innych elementów; wyrażenie ^mały|średni|duży$ działa nie tak, jak oczekujesz, ale można to poprawić, nadając mu postać ^(mały|średni|duży)$
Warto więc zapoznać się z kolejnością priorytetów, według której mechanizm parsuje wyrażenie:
( ) (?: );? + * {zakres dolny, zakres górny} ?? +? *? {zakres dolny, zakres górny}?;alamakota ^ $;|.Teraz już Czytelnik wie, że a|b* oznacza dopasuje literę a bądź też dowolną (czyli zero również!) liczbę wystąpień litery b, a (a|b)* dopasuje tekst składający się z litery a bądź litery b powtórzonej dowolną liczbę razy (również zero razy!).