BAZA WIEDZY
KURSY
Bazy danych w PHP
Kurs AdvancedAJAX
Kurs ASP
Kurs ASP.NET
Kurs C++
Kurs CSS
Kurs HTML
Kurs HTML drugi
Kurs JavaScript
Kurs MySQL
Kurs PHP
Kurs RSS
Kurs XHTML
Obiekty DOM
MANUALE
CSS1 - W3C
DOM - w budowie
PHP 2005
PHP 2006
Wyrażenia regularne
SHOUTBOX
STAT
Online: 30 | UU: 617
PORADY :: Co to jest wyrażenie regularne ?

Co to jest wyrażenie regularne?

Wyrażenia regularne są formą dopasowywania wzoru który można stosować na tekście. Weźmiemy na przykład znak ? i * w DOS'ie który można użyć poszukując plik. To jest rodzaj bardzo prymitywnego wyrażenia regularnego. Gdy chcemy w DOS'ie znaleść wszystkie pliki zaczynające się na "fn", dalej zawierające w nazwie od 1 do 4 losowych znaków, i kończonce się na "ht.txt", nie możemy tego zrobić używjąc zwykłych znaków w DOS'ie. Wyrażenie regularne natomiast może obsłużyć ten i wiele wiele innch bardziej skomplikowanych wzorów..

Wyrażenia regularne, w skrócie, są sposobem na efektywne obchodzenie się z danymi, przeszukiwanie i podmianę ciągów znaków, oraz daje możliwość rozszerzonej obsługi ciągów znaków. Często wyrażenie regularne obchodzi się z tekstem w taki sposób, że daje efekt jaki można uzyskać używając wbudowanych funkcjonalności lub właściwości tylko z wymieszaniem ze skomplikowanymi funkcjami lub pętlami..

Składnia RegExp

Istnieją dwa sposoby definiowania wyrażeń regularnych w JavaScript — jeden poprzez kostruktor obiektu RegExp i drugi poprzez literał (dosłownie). Obiekt może być zmieniony w trakcie uruchomiania kodu, ale literał jest kompilowany gdy ładowany jest skrypt, i daje lepszą wydajność. Literał najlepiej użyć gdy znamy wyrażenie regularne, podczas gdy konstruktor jest lepszy przy dynamicznym konstruowaniu wyrażeń regularnych takich jak wprowadzanych przez użytkownika. Prawie we wszystkich przypadkach możesz użyć obu sposobów definiowania wyrażeń regularnych, i będą ode obsługiwane w ten sam sposób niezależnie od tego w jaki sposób zostały one zadeklarowane.

Deklaracja w JavaScript

Oto sposoby deklaracji wyrażeń regularnych w JavaScript. Podczas gdy inne języki takie jak PHP albo VBScript używają innych separatorów, w JavaScript w trakcie deklaracji literału RegExp używamy ukośnika (/).

Składnia Przykład
Literał RegExp
/wzór/flagi; var re = /mac/i;
Konstruktor obiektu RegExp
new RegExp("wzór","flagi"); var re = new RegExp(window.prompt("Proszę wprowadzić regex.","yes|yeah"),"g");

Flagi

Istnieją trzy flagi z których można korzystać w RegExp. Flaga wielu linii jest słabo obsługiwana w starszych przeglądarkach, ale pozostałe dwie są obsługiwane w większości przeglądarek obsługujących RegExp. Flagi te można użyć w dowolnej kolejności lub kombinacji, i są integralną częścią RegExp.

Flaga Opis
Szukaj globalnie
g Flaga globalnego szukania powoduje że wyrażenie regularne szuka w tekście ciągów pasujących do wzoru tworząc tablicę wszystkich wystąpień tych ciągów w tekście.
Ignoruj wielkość
i Flaga ignorowania wielkości powoduje że wyrażenie regularne jest 'niewrażliwe' na wielkość liter - efekt działania wyrażenia jest taki sam bez względu na wielkość liter. Należy pamiętać że w wielu językach flaga ta nie działa na znaki typowe tylko dla danego języka, np. ą/Ą, ę/Ę.
Wieloliniowe wejście
m Ta flaga powoduje że znak początku tekstu (^) i końca tekstu ($) są także w kolejnych liniach znakami początku i końca linii.

Wzór

Wzory użyte w RegExp mogą być bardzo proste, albo bardzo skomplikowane, zależnie  od tego co chcemy osiągnąć. Napisanie wzoru pasującego do tekstu "Hello World!" nie jest trudniejsze niż napisanie samego tekstu, ale jeżeli chcesz dopasować adres email albo znaczniki html, możesz skończyć z bardzo skomplikowanym wzorem który będzie korzystał z większości składników wymienionych w tabeli niżej.

Wzór Opis
Metaznaki
\ Metaznaki są to znaki, które do dosłownego użycia (literalnego) wymagają poprzedzenia znakiem backslash (\).
Należy wspomnieć że używając ich w zbiorze znaków [...] nie trzeba dodawać backslasha.

Np: Wyrażenie /\(s\)/ pasuje do '(s)' natomiast /(\s)/ pasuje do wszystkich znaków specjalnych.
Kwalifikatory
{n}, {n,}, {n,m}, *, +, ? Kwalifikatory w wyrażeniach regularnych dopasowują tak wiele znaków jak to możliwe. Podwzór może być pojedynczym znakiem, znakiem kapsułkowanym, wzorem zamkniętym w separatorze wzorów lub zbiorem znaków.

{n} Oznacza dokładnie n razy wystąpień poprzedzającego wyrażenia.
{n,} Oznacza wystąpień poprzedzającego wyrażenia n albo więcej razy.
{n,m} Oznacza wystąpień poprzedzającego wyrażenia od n do m razy.
* jest skrótem dla {0,}. Oznacza zero lub więcej wystąpień poprzedzającego wyrażenia.
+ jest skrótem dla {1,}. Oznacza co najmniej jedno wystąpienie poprzedzającego wyrażenia.
? jest skrótem dla {0,1}. Oznacza najwyżej jedno (być może zero) wystąpienie poprzedzającego wyrażenia.

Np: /o{1,3}/ pasuje do 'oo' w tekście "tooth" i do 'o' w "nose".
Grupowanie wzorów
(wzór), (?:wzór) Grupuje wzór. Pomaga to w przechwytywaniu.

(wzór) przechwytuje pasujący ciąg znaków.
(?:wzór) nie przechwytuje pasującego ciągu znaków. Warto z tego wzoru korzystać gdy szukamy jakiegoś ciągu znaków ale odczytać chcemy tylko pewną jego część.

/(?:<\S+.*>)(.*)(?:<\/\S+>)/ pasuje do każdego znacznika ale pobierze tylko jego zawartość.

Np: /(d).\1/ pasuje 'dad' i przechwytujew tekście "abcdadef" gdzie /(?:.d){2}/ pasuje do 'cdad' ale nie łapie.

Notka: (?:wzór) jest bardzo słabo wspomagane w starszych przeglądarkach.
Lookahead
(?=wzór), (?!wzór)

regexp(?=wzór) dopasuje wyrażenie regexp i przechwyci je tylko gdy od razu za nim będzie dopasowany wzór.
regexp(?!wzór) dopasuje wyrażenie regexp i przechwyci je tylko gdy od razu za nim nie będzie dopasowany wzór.

Np: /Win(?=98)/ pasuje do'Win' tylko gdy za 'Win' jest jeszcze '98'. Przechwyci tylko Win.

Notka: Obsługi lookahead brakuje w większości nowych przeglądarek.
Alternatywa
| Alternatywa pasuje do tekstu gdy pasuje to co jest po lewej lub prawej stronie

Np: /(a|b)a/ pasuje do 'aa' w tekście "dseaas" i pasuje do 'ba' w tekście "acbab".
Zbiór znaków
[znaki], [^znaki] Pasuje do jakiegokolwiek znaku zawartego w zbiorze. Używając myślnika (-) można zdefiniować przedział dla znaków.

[znaki] pasuje do jakiegokolwiek znaku zawartego w zbiorze znaki.
[^znaki] zeguje zbiór znaków i pasuje do wszystkich znaków oprócz tych znajdujących się w zbiorze znaki
Np: /[abcd]/ pasuje do każdego znaku: 'a', 'b', 'c' lub 'd'. Wzór można także skrócić: /[a-d]/. Przedziały muszą być defifniowane w porządku rosnącym w przeciwnym wypadku wyrzucą błąd. (Np: /[d-a]/ wyrzuci błąd.)
/[^0-9]/ pasuje do wszystkich znaków oprócz liczb.

Notka: Większość znaków specjalnych zawartych w zbiorze znaków jest automatycznie kapsułkowane do ich znaczenia dosłownego. Np. /[.]/ pasuje do . a nie do wszystkich znaków oprócz końca linii.
Znaki specjalne
^, $, ., ?, +, *, \, (, ), |, [, {. Znaki specjalne to znaki które napisane takie jakie są nie oznaczają normalnego znaku. Aby można było traktować je dosłownie należy potraktować je jako metaznaki

^ dopasowuje się do początku tekstu (lub nowej linii gdy ustawiona flaga m).
$ dopasowuje się do końca tekstu (lub nowej linii gdy ustawiona flaga m).
. dopasowuje się do każdego znaku oprócz końca linii.
? wymieniony tuż za kwalifikatorem powoduje że kwalifikator jest 'nie chciwy' (spowoduje dopasowanie do wzoru z kwalifikatorem jak najkrótszego a nie najdłuższego ciągu znaków).

Np: /(.)*?/ pasuje do 'niczego' albo do '' we wszystkich ciągach znaków.

Notka: 'Nie zachłanne' porównania nie są wspierane przez starsze przeglądarki takie jak Netscape Navigator 4 lub Microsoft Internet Explorer 5.0.
Znaki dosłowne (literalne)
Wszystkie znaki oprócz tych o specjalnym znaczeniu Są to znaki zwykłe które umieszczone takie jakie są mają dokładnie takie znaczenie.

Np: /a/ pasuje do 'a' w tekście "Any ancestor".
Odwołanie wsteczne
\n Odwołania wsteczne są odwołaniami do ciągu znaków wcześniej pasujących do wzoru w wyrażeniu regularnym. n jest liczbą całkowitą większą od zera informującą przeglądarke o tym do którego wzoru ma się odwołać a konkretnie skąd ma wziąść ciąg znaków i umieścić w danym miejscu.

/(\S)\1(\1)+/g pasuje do wszystkich kombinacji trzech, lub więcej, kolejnych takich samych, nie białych, znaków.
/<(\S+).*>(.*)<\/\1>/ pasuje do każdego znacznika - taga.

Np: /<(\S+).*>(.*)<\/\1>/ pasuje do '<div id="me">text</div>' w tekście "text<div id=\"me\">text</div>text".
Znaki predefiniowane
\f, \r, \n, \t, \v, \0, [\b], \s, \S, \w, \W, \d, \D, \b, \B, \cX, \xhh, \uhhhh

Znaki predefiniowane są to zamienniki, które można użyć zamiast wymieniania grupy odpowiednich znaków lub w przypadku znaków komend.

\f znak wysunięcia arkusza.
\r znak powrotu karetki.
\n znak nowej linii.
\t tabulator horyzontalny.
\v matches vertical tab.
\0 znak NUL.
[\b] znak backspace.
\s odstęp (skrót dla [\f\n\r\t\v\u00A0\u2028\u2029]).
\S znak inny niż odstęp (skrót dla [^\f\n\r\t\v\u00A0\u2028\u2029]).
\w znka wyrazu (skrót dla [a-zA-Z0-9_]).
\W znak inny niż znak wyrazu (skrót dla [^a-zA-Z0-9_]).
\d liczba (skrót dla [0-9]).
\D znak inny niż liczba (skrót dla [^0-9]).
\b znak pozycji między wyrazami a dokładnie między spacją a wyrazem.
\B znak inny niż znak pozycji między wyrazami (skrót dla [^\b]).
\cX znak ctrl+X. Np: \cm oznacza control-M.
\xhh znak o kodzie hh zapisany w systemie hexadecymalnym.
\uhhhh znak Unicode o kodzie hhhh zapisany w systemie hexadecymalnym.

Kolejność priorytetów

( ), (?: ), ?, +, *, ^, $, |

Nawiasy: ( ), (?: ).
Powtórzenia: ?, +, *, {n, m}, ??, +?, *?, {n, m}?.
Sekwencje i asercje: ^, $.
Alternatywa: |.

Użycie w JavaScript

Teraz, wiedząc jak się pisze RegExp doszliśmy dopiero do połowy drogi. Aby zdobyć cokolwiek od wyrażeń regularnych trzeba wiedzieć także jak ich używać. Istnieje wiele sposobów żeby zaimplementować RegExp, niektóre metody należą do obiektu String, inne do obiektu RegExp. Kiedykolwiek deklarujemy wyrażenie regularne, użycie konstruktora bądź literału nie robi róźnicy.

Opis Przykład
RegExp.exec(string)
Stosuje wyrażenie RegExp w danym ciągu znaków, i zwraca pasujące informacje. var match = /s(amp)le/i.exec("Sample text")

zmienna match zawiera ["Sample","amp"]
RegExp.test(string)
Sprawdza czy ciąg znaków pasuje do wyrażenia, i zwraca true jeżeli pasuje bądź false jeżeli nie pasuje. var match = /sample/.test("Sample text")

zmienna match zawiera false mimo że sample zawiera się w ciągu znaków, gdyż istnieje różnica w wielkościach liter
String.match(wzór)
Porównuje ciąg znaków z wyrażeniem regularnym RegExp. Z flagą g zwraca tablicę ze wszystkimi pasującymi do wzoru ciągami znaków, bez flagi g zwraca tylko pierwszy pasujący ciąg a w przypadku gdy nie ma pasujących ciągów znaków zwraca null var str = "Watch out for the rock!".match(/r?or?/g)

zmienna str zawiera ["o","or","ro"]
String.search(wzór)
Porównuje RegExp z ciągiem znaków i zwraca indeks początku pasującego ciągu, -1 jeżeli nie. var ndx = "Watch out for the rock!".search(/for/)

zmienna ndx zawiera 10
String.replace(wzór,string)
Zamienia miejsca gdzie pasuje wzór na ciąg znaków dany jako drugi parametr i zwraca cały ciąg znaków po zmianie. var str = "Liorean said: My name is Liorean!".replace(/Liorean/g,'Big Fat Dork')

zmienna str zawiera "Big Fat Dork said: My name is Big Fat Dork!"
String.split(wzór)
Tnie ciąg znaków do tablicy w tych miejscach gdzie pasuje wzór. var str = "I am confused".split(/\s/g)

zmienna str zawiera ["I","am","confused"]

Autor: AT

| | | |
Copyright © 2006-2013 egrafik.pl | Kontakt | Reklama | Projekty domów
jocker