wyrażenia regularne

23
WYRAŻENIA REGULARNE

Upload: scale

Post on 18-Jun-2015

4.281 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Wyrażenia Regularne

WYRAŻENIA REGULARNE

Page 2: Wyrażenia Regularne

Zastosowania wyrażeń regularnych

Walidacja ciągów pod kątem zgodności ze wzorcem: IsMatch(), Match().

Wyszukiwanie podciągów zgodnych ze wzorcem: Matches(), Match().

Zastępowanie ciągów innymi ciągami: Replace().

Dzielenie ciągów na podciągi na podstawie wzorcowego ciągu dzielącego: Split().

Analiza leksykalna – konwersja ciągów w tokeny.

Page 3: Wyrażenia Regularne

Budowanie wrażeń regularnychZnaki dopasowań: \d – liczba 0-9 \D – wszystko oprócz liczb \w – słowo, znak a-z,A-Z,0-9 i _ \W – wszystkie znaki oprócz pasujących do \w \n \r \t \v \f – nowa linia, powrót karetki,

tabulacja,pionowa tabulacja, nowa strona \s biała spacja \S wszystko oprócz białej spacji

Page 4: Wyrażenia Regularne

Budowanie wrażeń regularnychZnaki powtórzeńWpływają na akceptowalną powtarzalność

poprzedzanego znaku lub grupy. {n} – występuje n razy + – przynajmniej raz (1 – ∞ ) * – dowolną ilość razy (0 – ∞) ? – zero lub raz (0,1) {n,} – n lub więcej razy (n – ∞) {n,m} – od n do m wystąpień (n – m)

Page 5: Wyrażenia Regularne

Budowanie wrażeń regularnychZnaki pozycyjne ^ – początek interpretowanego ciągu* $ – koniec interpretowanego ciągu*Znaki specjalne \} \{ \( \) \\

* - opcja RegexOptions.Multiline modyfikuje dopasowanie ^ oraz $

Page 6: Wyrażenia Regularne

Budowanie wrażeń regularnych . – każdy znak oprócz \n * | – logiczna alternatywa (\s|c) znaczy albo biała spacja

albo ‘c’ [] – dowolny znak z podanych [ac] znaczy ‘a’ lub ‘c’ [^] – dowolny znak oprócz podanych [^ac] znaczy

dowolny znak oprócz ‘a’ i ‘c’ \b – granica słowa (występuje między \w a \W) \B – granica nie słowa \z – koniec łańcucha \Z – koniec łańcucha lub nowa linia

* – opcja RegexOptions.Singleline modyfikuje dopasowanie .

Page 7: Wyrażenia Regularne

Analiza przykładowego wyrażenia

[1-9]\d[1-9]-?\d{3}-?\d{2}-?\d{2}

Liczba od 1 do 9 Liczba od 1-9

Dowolna liczba

Znak ‘-’ zero lub jeden raz

Znak ‘-’ zero lub jeden raz

Znak ‘-’ zero lub jeden raz

Trzy liczby Dwie liczby Dwie liczby

Page 8: Wyrażenia Regularne

Grupowanie

Znaki grupujemy za pomocą nawiasów ():(\d{3})-?(\d{3})-?(\d{2})-?(\d{2})Wynik parsowania 123-456-78-90:Grupa 1: 123Grupa 2: 456Grupa 3: 78Grupa 4: 98

Wynik parsowania 9087654321:Grupa 1: 908Grupa 2: 765Grupa 3: 43Grupa 4: 21

Możemy usunąć grupowanie, jeśli chcemy użyć nawiasów np. do grupowania ciągów z alternatywą używając ‘?:’ (?: a | b | \d){3} – (\d | \w)Wynik dla a3b - 7:Grupa 1: 7

Page 9: Wyrażenia Regularne

Nazywanie grup, odwołania

Grupy możemy nazywać używając składni (?<nazwa_grupy>) np. (?<user>[a-zA-Z_.]+)

Odwoływanie się do grup Przez numer grupy \numer_grupy np.: (\b[a-zA-Z]+\b)\s\1

Przez nazwe grupy \k<nazwa_grupy> np.: (?<word>\b[a-zA-Z]+\b)\s\k<word>

Ciągi testowe:test test //pasuje

Slowo1 slowo2 //nie pasuje

Page 10: Wyrażenia Regularne

Używanie wyrażeń regularnych w .net

Tworząc explicite obiekt

Statyczne wywołanie

Regex visaCardValidation = new Regex("^([4]{1})([0- 9]{12,15})$"); if (!visaCardValidation.IsMatch(”4125632152365")) { //[...] }

if (!Regex.IsMatch("4125632152365", "^([4]{1})([0-9]{12,15})$")) { //[...] }

Page 11: Wyrażenia Regularne

Używanie wyrażeń regularnych w .net

Konstruktor z opcjami RegexOptions

Przeciążone metody statyczne z opcjami RegexOptions

Regex chinaUnicomPhoneNo = new Regex(„^(\+?(?:86)?)(s?-?)((13[0-4])(\d{4})(\d{4}))$”, RegexOptions.Compiled | RegexOptions.IgnorePatternWhitespace)

Regex.IsMatch(„+8613012345678”, „^(\+?(?:86)?)(s?-?)((13[0- 4])(\d{4})(\d{4}))$”, RegexOptions.CultureInvariant | RegexOptions.IgnorePatternWhitespace)

Page 12: Wyrażenia Regularne

RegexpOptions

Opcja Opis

None Brak opcji

IgnoreCase Dopasowanie nie zależy od wielkości znaków

Multiline Modyfikuje dopasowanie ^ i $. Pasują odpowiednio do początku i końca każdej linii w ciągu.

ExplicitCapture

Aby utworzyć grupę musimy ją jawnie nazwać lub nadać numer. Nie potrzeba używać (?:….) do anulacji grupowania.

Compiled Wyrażenie regularne jest kompilowane do MSIL. Szybciej działa przy wielokrotnym wykorzystniu tego samego wzorca.

Singleline Modyfikuje dopasowanie ‘.’ – korpka pasuje do każdego znaku nwet \n

IgnorePattern – Whitespace

Ignoruje białe znaki we wzorcu. Pozwala na stosowanie komentarzy (?#komentarz … )

RightToLeft Ciąg przeszukiwany jest od prawej do lewej

Page 13: Wyrażenia Regularne

RegexpOptions

Opcja Opis

ECMAScript Wymusza walidację zachowującą się zgodnie ze specyfikację ECMAScript. Opcję tą można użyć tylko z opcjami Multiline i IgnoreCase. Inne złożenie spowoduje wyjątek.

CultureInvariant Różnice językowe są ignorowane. (np. ‘i’ oraz ‘I’ traktowane jest tak samo.

Page 14: Wyrażenia Regularne

Match() Matches()

Match() Sprawdza zgodność ciągu ze wzorcem

(sukces gdy choć jeden podciąg pasuje do wzorca).

Zwraca obiekt Match z pierwszym podciągiem pasującym do wzorca

Matches() Wyszukuje w ciągu wszystkie podciągi

pasujące do wzorca Zwraca obiekt MatchCollection

Page 15: Wyrażenia Regularne

MatchCollection

Match

GroupCollection

Group Group

CatureCollection

Capture Capture Capture

Group

Match Match

Page 16: Wyrażenia Regularne

Zastępowanie podciągów: Replace()

Zastępuje każdy podciąg pasujący do wzorca nową wartością.

String MDYToDMY(String input)

{

return Regex.Replace(input,

"\\b(?<month>\\d{1,2})/(?<day>\\d{1,2})/(?<year>\\d{2,4})\\b",

"${day}-${month}-${year}");

}

Zastąpi daty w formacie mm\dd\yyyy na daty w formacie dd-mm-yyyy

Page 17: Wyrażenia Regularne

Znaki specjalne ciągu zastępującego dopasowania

Znak Przez co zostanie zastąpiony

$n Ostatnie dopasowanie grupy o numerze n

${nazwa} Ostatnie dopasowanie grupy o podanej nazwie

$$ Pojedynczy znak $

$& Cały dopasowany podciąg

$` Cały ciąg poddany analizie

$’ Cały ciąg po analizie

$+ Ostatnio dopasowana grupa

$_ Cały ciąg wejściowy

Page 18: Wyrażenia Regularne

Przykład zastosowania replace()

Zamiana pełnych adresów e-mail na ciągi nie rozpoznawane przez boty:

Regex.replace(strTekst,

@”\b(?user:(.|\w)*)@(?domain:(.|\w)*\b)”, „${user}_malpa_${domain}”)

Page 19: Wyrażenia Regularne

Użycie funkcji split()

Dzieli wejściowy ciąg na podciągi, przyjmując jako znak podziału wyrażenie regularne.

Zwraca tablicę wyznaczonych podciągów.

Regex.Split(

Page 20: Wyrażenia Regularne

Walidacja danych wejściowych RegularExpresionValidator

Dane wejściowe z kontrolki walidowane są pod kątem zgodności z podanym wzorcem

Przykład …

Page 21: Wyrażenia Regularne

Wyrażenia regularne w JavaScript

Wyrażenia zapisujemy między dwoma znakami /. Za końcowym / możemy dodać flagi, np. var reg = /\b\w*\b/gzwróci wszystkie słowa w tekście.

Dostepne flagi g – przeszukiwanie globalne (bez tej flagi

zostanie znalezione pierwsze wystąpienie) i – odpowiednik ignore-cases m – odpowiednik multiline

Page 22: Wyrażenia Regularne

Wyrażenia regularne w JavaScript

Dostępne funkcje str.search(regexp) – zwraca pozycję

pierwszego wystąpienia wzorca (-1 jeśli nie znaleziono).

var resultTab = str.match(regexp) - zwraca do tablicy wszystkie podciągi pasujące do wzorca

str =str.replace(regexp_co, naco) – zamienia podciągi pasujące do wzorca na nową wartość.

Page 23: Wyrażenia Regularne

Wyrażenia regularne w JavaScript

Var resultTab = str.split(regex) – dzieli ciąg na podciągi przyjmując za miejsce podzialu dopasowania regex.

var reg = new Regexp(regex); reg.test(tekst) - sprawdza czy podany ciąg pasuje do wzorca

Dodatkowe informacje:http://www.devshed.com/c/a/JavaScript/

Understanding-the-JavaScript-RegExp-Object/