Wyrażenia regularne

Co to są wyrażenia regularne?

#define

Wyrażenia regularne (regex|regexp) to wzorce służące do dopasowywania lub znajdowania łańcuchów znaków przy użyciu symboli wieloznacznych i metaznaków.

#ifdef

Gdzie mogą się przydać wyrażenia regularne? Wszędzie gdzie mamy w jakiś sposób ustandaryzowaną strukturę danych.

#endif

Jak wyglądają regexy:

Wyrażenie regularne to ciąg znaków, który składa się z:
/a/
Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
/Mary/
Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
/.a/
Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
/.*/
Special characters must be escaped.*
/\.\*/
Special characters must be escaped.*
/[a-z]a/
Mary had a little lamb.
And everywhere that Mary
went, the lamb was sure
to go.
/A+B*C?D/
AAAD
ABBBBCD
BBBCD
ABCCD
AAABBBC
/a{5} b{,6} c{4,8}/
aaaaa bbbbb ccccc
aaa bbb ccc
aaaaa bbbbbbbbbbbbbb ccccc
/a+ b{3,} c?/
aaaaa bbbbb ccccc
aaa bbb ccc
aaaaa bbbbbbbbbbbbbb ccccc

Przykłady

/[0-9]{2}-[0-9]{3}/  Kod pocztowy
/[0-9]{9}/ lub /\d{9}/ Pesel
/[a-zA-z0-9_.-]+@[a-z0-9]+\.[a-z0-9]+/

Szybka pomoc:

[abc]Pojedynczy znak: a, b czy c
[^abc]Dowolny pojedynczy znak oprócz: a, b, czy c
[a-z]Pojedynczy znak w predziale a-z
[a-zA-Z]     Pojedynczy znak w przedziale a-z czy A-Z
.Dowolny pojedynczy znak
a*Zero albo więcez znaków a
a+Jeden albo więcej znaków a
a{3}Dokładnie 3 znaki a
a{3,6}Pomięzy 3 a 6 znaków a

IP adress

/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/

Poprawność zakresu?

Grupowanie, oraz zmienne $1, $2 ...

/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/

Skrypt sprawdzający poprawność adresu IP.

/(\d{1,3}\.){3}(\d{1,3})/
/(?:\d{1,3}\.){3}\d{1,3}/

Zadanie

Znaleźć słowa zaczynające się 'th' i kończącze 's'.
this line matches just right
		Those worlds must be matched
this # thus # thistle
# thesse #
/th.*s/
/th[^s ]*s/
/th\w*s/
/th.*?s/

SYSLOG

sshd PAM error

/var/log/messages

Apr  4 19:16:20 sergiy sshd[8704]: error: PAM: authentication error for sergiy from 156.17.70.157
^(.*\d{2}:\d{2}:\d{2}).*sshd.*: error: PAM:.*for (\w+) from (.*)$

Zadanie z firewallem

    156.17.213.34 ftp
    156.17.213.36 ftp
    #156.17.213.75 sql
    #156.17.213.76 sql 
    156.17.213.75 sql
    192.168.1.178 ftp sql # not pay
    
s/#.*\n/\n/
/((?:\d{1,3}\.){3}\d{1,3}).*ftp/

Linki zewnętrzne

http://rubular.com/

http://perldoc.perl.org/

EOF