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
.
DEL
). W innych zestawach znaków są znakami im równoważnymi,
jeśli są takowe.
0 1 2 3 4 5 6 7 8 9
.
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
.
! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
.
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
.
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:
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.