Jesteś tutaj: GłównaWyrażenia regularne → Alternatywy i kolejność priorytetów

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|ąb

Dopasuje ciągi znaków z, d, r albo ąb.

(z|d|r)ąb

Dopasuje słowa ząb, dąb albo rąb, a literę (z, d albo r) zapamięta w zmiennej \1.

(?:z|d|r)ąb

Robi to, co wyrażenie w przykładzie wyżej, ale nie zapamiętuje litery w zmiennej \1.

Ważne szczegóły

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…

Kolejność priorytetów

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:

  1. Nawiasy: ( ) (?: );
  2. Powtórzenia: ? + * {zakres dolny, zakres górny} ?? +? *? {zakres dolny, zakres górny}?;
  3. Sekwencje i asercje: alamakota ^ $;
  4. Alternatywa: |.

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!).