Wyrażenia Regularne

Przy wyszukiwaniu (z wyłączeniem szukania w treści czytanego/pisanego listu) i filtrowaniu poczty można korzystać z wyrażeń regularnych. Chyba każdy użytkownik MS-DOS'a zna "wildcardy" w stylu "*.*" czy "a?chive.r??" - w MS-DOSie gwiazdka zastępuje dowolną ilość dowolnych znaków, pytajnik - jeden dowolny znak. Są to proste wyrażenia regularne.

Wyrażenia regularne stosowane w programie, umożliwiają stosowanie różnych operatorów, w tym logicznych, co pozwala na znajdywanie ciągów znaków spełniających określone kryteria - w jednym wyszukiwaniu! Znacząco ułatwia to wyszukiwanie, bo poprawnie skonstruowane wyrażenie od razu odrzuca niechciane "znaleziska", i dodaje te, które pomięlibyśmy przy zwykłym wyszukiwaniu. Należy mieć na względzie fakt, iż stosowanie wyrażeń regularnych spowalnia (często nawet trzykrotnie) wyszukiwanie, i dlatego nie zawsze się opłaca je stosować. Wyrażenie działa w całości szukanego obszaru (nie jest on dzielony na wiersze). Przykładowo, jeżeli w wiadomości są wyrazy "Kot" i "Pies" w różnych wierszach, w dwóch różnych wierszach, wyrażenie "Kot"|"Pies" BĘDZIE pasowało do tej wiadomości. System wyrażeń jest zgodny z Perlem 5, więc jeżeli korzystasz z niego, masz ułatwione życie.

Kod procedur odpowiedzialnych za wyrażenia regularne nie jest dziełem autora programu; prawowitym autorem jest Philip Hazel <ph10@cam.ac.uk>. Poniżej znajduje się skrócony opis oznaczeń, szczegółowe informacje można uzyskać czytając dokumentację projektu PCRE (http://www.pcre.org/). Oprócz tego, poleceniem "Testuj wyrażenia" z menu "Opcje", możesz dowolnie eksperymentować z wyrażeniami regularnymi.

  1. Litery, cyfry i inne zwyczajne znaki zostają dopasowane do siebie.

    Przykładowo:

    Kolor

    znajduje wszystko zawierające wyraz Kolor.

  2. Znaki specjalne

    \ Traktuje następny znak tak jak jest
    . Odnajduje dowolny znak
    ^ Odnajduje początek linii
    $ Odnajduje koniec linii
    | Alternatywa (logiczne "lub")
    (..) Grupowanie wyrażeń
    [..] Odnajduje jeden ze znaków z zestawu
    [^..] Odnajduje wszystkie znaki nie pasujące do zestawu

    Przykładowo

    pomoc\.

    Odnajduje wyraz "pomoc." (z kropką)

    Kas.a

    Odnajduje "Kasia", "Kasza", "Kaska", (..itd).

    ^test

    Odnajduje "tester", "testuję", ale nie "czas na test".

    \.pl$

    Odnajduje wszystkie adresy z polskią domeną (www.hcm.prv.pl, www.delphi.pl, ale nie www.freshmeat.net).

    Kot|Mysz

    Odnajduje "Kot" lub "Mysz"

    Aku(rat|punktura)

    Odnajduje "Akurat" lub "Akupunktura"

    [aeiou]

    Odnajduje samogłoskę.

    [a-z0-9]

    Odnajduje dowolną literę lub cyfrę. Zauważ, że "-" jest użyte do określenia zasięgu. Jeżeli chcesz go dołączyć do zestawu, umieść go na początku lub końcu zestawu, np. [a-f0-9-] odnajduje a-f, 0-9 i minus.

  3. Kwantyfikatory (ile razy szukana występuje)

    * - Zero lub więcej razy
    + - Co najmniej raz
    ? - Albo raz, albo wcale
    {n} - Dokładnie n razy
    {n,} - Przynajmniej n razy
    {n,m} - Przynajmniej n, ale nie więcej jak m razy.

    Przykładowo

    ma+

    Odnajduje "ma" "maaa" "maaaaaaa"

    ma*

    Odnajduje "m" "maaa"

    (yada ){2,}

    Odnajduje "yada yada yada "

    har(c?)ówka

    odnajduje "harówka" i "harcówka"

  4. Skróty dla całych zestawów znaków

    \w - Odnajduje litery wyrazowe: litery, cyfry, i "_"
    \W - Przeciwieństwo powyższego
    \s - Odnajduje odstępy (spacje, tabulacje, cr, lf)
    \S - Przeciwieństwo powyższego
    \d - Odnajduje cyfrę
    \D - Przeciwieństwo powyższego

    Przykładowo

    \d\d\d([- ]|\s)?\d\d([- ]|\s)?\d\d

    Odnajduje numer telefonu (np.612-34-56) - trzy cyfry, potem minus lub odstęp, potem dwie cyfry, minus lub odstęp, i dwie cyfry.

  5. Ograniczniki wyrazów

    \b - Odnajduje ogranicznik słowa
    \B - Przeciwieństwo powyższego

    Przykładowo

    \bpakuj

    Odnajduje "to pakuj", ale nie "zapakuj".

    Jpeg\b

    Odnajduje "Jpeg to", ale nie "JpegLib" czy "jpeg.dll"

    \bkaszana\b

    Odnajduje sam wyraz "kaszana"

    poli\B

    Odnajduje "Polinejek", "polimorfizm", "polibuda", "polityka", ale nie "Poli Raksy"

  6. Tylne odniesienia

    Jeśli twoje wyrażenie zawiera przynajmniej jedno podwyrażenie, możesz się odnieść do Ntego podwyrażenia używając \N, gdzie N to liczba z zakresu <1,19>. Przykładowo:

    (\b\w+\b) za \1

    Odnajduje "oko za oko", "ząb za ząb", ale nie "ciemny jak Bonik". Wyrażenie \b\w+\b odnajduje cały wyraz, a nawiasy zapisują go jako podwyrażenie #1 i \1 odnosi się do niego.

  7. Szukanie z wyprzedzeniem/cofnięciem

    (?=regexp) - Wyprzedzająca asercja
    (?!regexp) - Przeciwieństwo powyższego
    (?<=regexp) - Cofająca asercja
    (?<!regexp) - Przeciwieństwo powyższego

    Przykładowo

    \w+(?=\t)

    Odnajduje wyraz, po którym występuje znak tabulacji, znaleziony jednak zostanie wyraz (bez tabulacji)

    foo(?!bar)

    Odnajduje dowolny wyraz "foo", po którym nie występuje "bar".

    (?<!foo)bar

    Odnajduje wyraz "bar", który nie jest poprzedzony przez Foo.