Przejdź do pierwszej, poprzedniej, następnej, ostatniej sekcji, spisu treści.


5. Wyrażenia regularne

Wyrażenie regularne to wzorzec opisujący zbiór łańcuchów. Wyrażenia regularne są zbudowane analogicznie do wyrażeń arytmetycznych, przez zastosowanie do połączenia mniejszych wyrażeń rozmaitych operatorów. grep rozumie dwie różne wersje składni wyrażeń regularnych: "podstawową" i "rozszerzoną". W GNU grep obie te składnie nie różnią się zakresem dostępnych możliwości. W innych implementacjach podstawowe wyrażenia regularne są mniej rozbudowane. Poniższy opis stosuje się do rozszerzonych wyrażeń regularnych; różnice w stosunku do wyrażeń podstawowych podsumowano na końcu.

Fundamentalnymi "cegiełkami" są wyrażenia regularne pasujące do pojedynczego znaku. Większość znaków, w tym wszystkie litery i cyfry, to wyrażenia regularne pasujące do samych siebie. Każdy metaznak mający specjalne znaczenie może być cytowany przez poprzedzenie go odwrotnym ukośnikiem. Lista znaków zawarta między `[' a `]' pasuje do każdego pojedynczego znaku na tej liście; jeśli pierwszym znakiem listy jest daszek `^', pasuje wtedy ona do każdego znaku nie znajdującego się na liście. Na przykład, wyrażenie regularne `[0123456789]' pasuje do każdej pojedynczej cyfry. Można określić zakres znaków, podając znak pierwszy i ostatni, oddzielone myślnikiem.

I na koniec: predefiniowano pewne nazwane klasy znaków. Ich interpretacja zależy od ustawienia regionalnego LC_CTYPE. Poniżej przedstawiono interpretację dla locale POSIX, co jest ustawieniem domyślnym, gdy nie podano LC_CTYPE.

`[:alnum:]'
znaki alfanumeryczne: `[:alpha:]' i `[:digit:]'.
`[:alpha:]'
Znaki alfabetu: `[:lower:]' i `[:upper:]'.
`[:blank:]'
Znaki odstępu: Spacja i tabulacja.
`[:cntrl:]'
Znaki sterujące. W ASCII mają one kody ósemkowe od 000 do 037, oraz 177 (DEL). W innych zestawach znaków są znakami im równoważnymi, jeśli są takowe.
`[:digit:]'
Cyfry: 0 1 2 3 4 5 6 7 8 9.
`[:graph:]'
Znaki graficzne: `[:alnum:]' i `[:punct:]'.
`[:lower:]'
Małe litery: a b c d e f g h i j k l m n o p q r s t u v w x y z.
`[:print:]'
Znaki drukowalne: `[:alnum:]', `[:punct:]' i spacja.
`[:punct:]'
Znaki interpunkcyjne: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~.
`[:space:]'
Znaki przerwy: Tabulacja, znak nowej linii, tabulacja pionowa, wysuw strony, powrót karetki i spacja.
`[:upper:]'
Duże litery: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z.
`[:xdigit:]'
Cyfry szesnastkowe: 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f.

Na przykład `[[:alnum:]]' oznacza `[0-9A-Za-z]', z tym wyjątkiem, że ta druga forma zależy od kodowania znaków ASCII i ustawień regionalnych POSIX (locale), podczas gdy pierwsza jest przenośna. (Zauważ, że nawiasy kwadratowe w nazwach klas są częścią nazw symbolicznych i muszą być umieszczone dodatkowo, oprócz pary nawiasów ograniczającej samą listę). Większość metaznaków traci swoje szczególne znaczenie wewnątrz list. Aby ująć tam dosłowny `]', należy umieścić go jako pierwszy na liście. Podobnie, aby ująć dosłowny `^', należy umieścić go gdziekolwiek poza pierwszym miejscem. W końcu, aby ująć na liście dosłowny `-', trzeba umieścić go na ostatku.

Kropka `.' pasuje do każdego pojedynczego znaku. Symbol `\w' to synonim `[[:alnum:]]', a `\W' to synonim `[^[:alnum]]'.

Daszek `^' oraz znak dolara `$' są metaznakami, które pasują odpowiednio do łańcucha pustego na początku i na końcu linii. Symbole `\<' oraz `\>' pasują odpowiednio do łańcucha pustego na początku i na końcu wyrazu. Symbol `\b' pasuje do łańcucha pustego na krawędzi wyrazu, zaś `\B' pasuje do pustego łańcucha pod warunkiem, że nie występuje on na krawędzi wyrazu.

Po wyrażeniu regularnym może następować jeden z kilku operatorów powtórzenia:

`?'
Poprzedzający element jest opcjonalny i pasuje nie więcej niż raz.
`*'
Poprzedzający element będzie dopasowany zero lub więcej razy.
`+'
Poprzedzający element będzie dopasowany co najmniej raz.
`{n}'
Poprzedzający element pasuje dokładnie n razy.
`{n,}'
Poprzedzający element pasuje co najmniej n razy.
`{n,m}'
Poprzedzający element pasuje co najmniej n, ale nie więcej niż m razy.

Dwa wyrażenia regularne można ze sobą złączyć (skonkatenować). Do tak powstałego wyrażenia regularnego pasuje każdy ciąg utworzony przez złączenie dowolnych dwóch ciągów, które odpowiednio pasują do złączonych podwyrażeń.

Dwa wyrażenia regularne można połączyć operatorem wrostkowym (infiksowym) `|'. Do tak powstałego wyrażenia regularnego pasuje dowolny ciąg pasujący do jednego bądź do drugiego z podwyrażeń.

Powtarzanie ma priorytet nad łączeniem, które z kolei bierze górę nad alternatywą. Całe wyrażenie regularne można ująć w nawiasy, celem unieważnienia tych reguł priorytetowych.

Wsteczne odniesienie `\n', gdzie n jest pojedynczą cyfrą, dopasowuje podciąg poprzednio dopasowany n-tym ujętym w nawiasy podwyrażeniem wyrażenia regularnego.

W podstawowych wyrażeniach regularnych metaznaki `?', `+', `{', `|', `(' i `)' tracą swoje szczególne znaczenie. Zamiast nich należy użyć wersji z odwrotnym ukośnikiem: `\?', `\+', `\{', `\|', `\(' i `\)'.

Tradycyjny egrep nie traktuje `{' jako metaznaku. Niektóre implementacje udostępniają zamiast niego `\{', więc przenośne skrypty powinny unikać `{' we wzorcach `egrep', a do dopasowywania dosłownego znaku `{' stosować `[{]'.

GNU egrep usiłuje obsługiwać tradycyjny sposób użycia zakładając, że `{' nie posiada szczególnego znaczenia jeśli byłby on początkiem nieprawidłowego określenia liczby powtórzeń. Na przykład, polecenie powłoki `egrep '{1'' szuka dwuznakowego łańcucha `{1', zamiast zgłaszać błąd składni POSIX.2 pozwala na takie zachowanie jako rozszerzenie standardu, ale przenośne skrypty powinny go unikać.


Przejdź do pierwszej, poprzedniej, następnej, ostatniej sekcji, spisu treści.