Wyrażenia regularne w S-Langu

S-Lang wspiera następujące wyrażenia regularne (dalej WR)

   .                 każdy znak, oprócz znaku nowej linii
   *                 zero lub więcej wystąpień poprzedniego WR
   +                 jedno lub więcej wystąpień poprzedniego WR
   ?                 zero lub jedno wystąpienie poprzedniego WR
   ^                 początek linii
   $                 koniec linii
   [ ... ]           każdy pojedyńczy znak między nawiasami.
                     Na przykład [-02468] oznacza '-' lub każdą
		     z liczb parzystych, a [-0-9a-z] oznacza
		     '-', każdą cyfrę i litery z przedziału a-z.
   \<                początek słowa
   \>                koniec słowa
   \( ... \)
   \1, \2, ..., \9   Ciąg znaków znaleziony jako wynik n-tego 
                     wyrażenia \( ... \)
Dodatkowo wspierane są również następujące wyrażenia:
   \c                włącz rozróżnianie wielkości znaków
   \C                wyłącz rozróżnianie wielkości znaków
   \d                każda cyfra
   \e                znak ESC
Poniżej znajduje się kilka prostych przykładów:

"^int " znajdzie "int " na początku linii

"\<money\>" znajdzie "money", ale tylko, jeśli jest to osobne słowo

"^$" znajdzie pustą linię.

Trochę bardziej skomplikowanym wyrażeniem jest

  "\(\<[a-zA-Z]+\>\)[ ]+\1\>"
które znajdzie każde powtórzone po sobie słowo ("jest jest"). Zwróć uwagę na sposób użycia operatorów grupujących \( oraz \) do zdefiniowania tekstu znalezionego przez zacytowanie powyżej WR. Tekst ten jest potem oznaczany jako \1.

Pamiętaj, że w kodzie S-Lang-a (i C) znak '\' należy 'podwoić', gdyż używany jest on normalnie do cytowania znaków niedrukowalnych.

Różnice między S-Langowymi WR a WR znanymi z egrepa

Najistotniejszą różnicą jest niewspieranie przez S-Langowe WR operatora OR (|). Oznacza to, że wyrażenia "a|b" lub "a\|b" nie mają znaczenia, jakie mają w przypadku egrepa.

Drugą istotną różnicą jest sposób wykorzystania grupujących operatorów \( i \). W S-Langowych WR używane są one tylko do oznaczenia znalezionego tekstu. Wyrażenie

     "@\([a-z]*\)@.*@\1@"
pasuje do ciągu xxx@abc@silly@abc@yyy, ponieważ \1 oznacza w nim tekst odnaleziony przez wyrażenie zawarte pomiędzy \( i \). W bieżącej wersji S-Langa nie ma możliwości użycia operatorów grupujących do utworzenia z kilku WR wyrażenia pojedyńczego, tzn. w S-Langu wyrażenie \(hello\)* nie jest wzorem oznaczającym jedno lub więcej wystąpienie słowa "hello", tak jak byłoby to w przypadku e-grepa.
tłum. Tomasz Sienicki, tsca @ edb . dk
Zobacz też: S-Langowe makra do jeda i slrna