From 86e51f7baad389ddf34bf62e31fbcb8e085c9160 Mon Sep 17 00:00:00 2001 From: donpepe0 Date: Wed, 20 Dec 2017 17:27:14 +0100 Subject: [PATCH] Polish translation (#105) * introdution and p.1 translated * introdution and p.1 translated * 2.3 translated * 2.8.1 translated * 3. translated * all text translated * image translated, and replaced * fixed link in context tabe --- README-cn.md | 1 + README-es.md | 1 + README-fr.md | 1 + README-gr.md | 1 + README-ja.md | 1 + README-ko.md | 1 + README-pl.md | 533 ++++++++++++++++++++++++++++++++++++++++++++++ README-pt_BR.md | 1 + README-tr.md | 1 + README.md | 1 + img/regexp-pl.png | Bin 0 -> 20204 bytes 11 files changed, 542 insertions(+) create mode 100644 README-pl.md create mode 100644 img/regexp-pl.png diff --git a/README-cn.md b/README-cn.md index add4168..0f7e9b8 100644 --- a/README-cn.md +++ b/README-cn.md @@ -13,6 +13,7 @@ * [한국어](README-ko.md) * [Turkish](README-tr.md) * [Greek](README-gr.md) +* [Polish](README-pl.md) ## 什么是正则表达式? diff --git a/README-es.md b/README-es.md index 48d54da..3f59d66 100644 --- a/README-es.md +++ b/README-es.md @@ -14,6 +14,7 @@ * [한국어](README-ko.md) * [Turkish](README-tr.md) * [Greek](README-gr.md) +* [Polish](README-pl.md) ## Qué es una expresión regular? > Una expresión regular es un grupo de caracteres o símbolos, los cuales son usados para buscar un patrón específico dentro de un texto. diff --git a/README-fr.md b/README-fr.md index 6e7c65d..8216394 100644 --- a/README-fr.md +++ b/README-fr.md @@ -13,6 +13,7 @@ * [한국어](README-ko.md) * [Turkish](README-tr.md) * [Greek](README-gr.md) +* [Polish](README-pl.md) ## Qu'est-ce qu'une expression régulière? diff --git a/README-gr.md b/README-gr.md index 8fb7da2..935f082 100644 --- a/README-gr.md +++ b/README-gr.md @@ -14,6 +14,7 @@ * [한국어](README-ko.md) * [Turkish](README-tr.md) * [Greek](README-gr.md) +* [Polish](README-pl.md) ## Τι είναι μια Κανονική Έκφραση (Regular Expression); diff --git a/README-ja.md b/README-ja.md index 126cde8..af9d8b3 100644 --- a/README-ja.md +++ b/README-ja.md @@ -13,6 +13,7 @@ * [한국어](README-ko.md) * [Turkish](README-tr.md) * [Greek](README-gr.md) +* [Polish](README-pl.md) ## 正規表現とは diff --git a/README-ko.md b/README-ko.md index 7d0097e..e3029d0 100644 --- a/README-ko.md +++ b/README-ko.md @@ -13,6 +13,7 @@ * [한국어](README-ko.md) * [Turkish](README-tr.md) * [Greek](README-gr.md) +* [Polish](README-pl.md) ## 정규표현식이란 무엇인가? diff --git a/README-pl.md b/README-pl.md new file mode 100644 index 0000000..28622c4 --- /dev/null +++ b/README-pl.md @@ -0,0 +1,533 @@ +
+

+Learn Regex +


+ +## Tłumaczenia: + +* [English](README.md) +* [Español](README-es.md) +* [Français](README-fr.md) +* [Português do Brasil](README-pt_BR.md) +* [中文版](README-cn.md) +* [日本語](README-ja.md) +* [한국어](README-ko.md) +* [Turkish](README-tr.md) +* [Greek](README-gr.md) +* [Polish](README-pl.md) + +## Co to jest wyrażenie regularne? + +> Wyrażenie regularne to grupa znaków lub symboli, które służą do odnalezienia określonego wzoru w tekście. + +Wyrażenie regularne to wzorzec, który jest dopasowywany do tekstu od lewej +do prawej strony. Termin "wyrażenie regularne" (ang. "regular expression") +jest dość długie, więc zazwyczaj używa się skróconej formy "regex" lub "regexp". +Wyrażenie regularne jest używane do zastępowania tekstu w łańcuchu znaków +(ang. string), walidacji formularzy, wyodrębniania wycinka z łańcucha +(ang. substring) według podanego wzorca, i wielu innych. + +Wyobraź sobie, że piszesz aplikację i chcesz ustawić reguły dotyczące tego, +jak użytkownik wybiera swoją nazwę. Chcemy, aby nazwa użytkownika zawierała litery, +liczby, podkreślenia i myślniki. Chcemy również ograniczyć liczbę znaków w nazwie +użytkownika, aby nie wyglądała za brzydko. Stosujemy następujące wyrażenie +regularne, aby sprawdzić poprawność nazwy: + +

+

+ Wyrażenie regularne +

+ +Powyższe wyrażenie akceptuje łańcuchy `john_doe`, `jo-hn_doe` +i `john12_as`. Odrzuca `Jo` ponieważ łańcuch zawiera dużą literę +i jest za krótki. + +## Spis treści + +- [Najprostsze wyrażenie](#1-najprostsze-wyrażenie) +- [Metaznaki](#2-metaznaki) + - [Kropka](#21-kropka) + - [Zestaw znaków](#22-zestaw-znaków) + - [Odwrócony zestaw znaków](#221-odwrócony-zestaw-znaków) + - [Powtórzenia](#23-powtórzenia) + - [Gwiazdka](#231-gwiazdka) + - [Plus](#232-plus) + - [Znak zapytania](#233-znak-zapytania) + - [Klamry](#24-klamry) + - [Grupa znaków](#25-grupa-znaków) + - [Alternatywa](#26-alternatywa) + - [Znak ucieczki](#27-znak-ucieczki) + - [Kotwice](#28-kotwice) + - [Kareta](#281-kareta) + - [Dolar](#282-dolar) +- [Skróty](#3-skróty) +- [Lookaround](#4-lookaround) + - [Lookahead](#41-lookahead) + - [Odwrócony lookahead](#42-odwrócony-lookahead) + - [Lookbehind](#43-lookbehind) + - [Odwrócony lookbehind](#44-odwrócony-lookbehind) +- [Flagi](#5-flagi) + - [Wielkość znaków](#51-wielkość-znaków) + - [Przeszukiwanie globalne](#52-przeszukiwanie-globalne) + - [Multilinia](#53-multilinia) + +## 1. Najprostsze wyrażenie + +Wyrażenie regularne to ciąg znaków, których używamy do przeszukania tekstu. +Na przykład, wyrażenie `the` oznacza: literę `t`, następującą +po niej literę `h`, następującą po niej literę `e`. + +
+"the" => The fat cat sat on the mat.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/dmRygT/1) + +Wyrażenie regularne `123` pasuje do łańcucha `123`. Wyrażenie regularne +jest dopasowywane do danego łańcucha poprzez porównanie każdego znaku, +jeden po drugim, w wyrażeniu i łańcuchu. Wyrażenia są zwykle wrażliwe +na wielkość znaków, więc wyrażenie `The` nie pasuje do łańcucha `the`. + +
+"The" => The fat cat sat on the mat.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/1paXsy/1) + +## 2. Metaznaki + +Metaznaki to składowe elementy wyrażeń regularnych. Znaki te, nie oznaczają +siebie samych, są natomiast interpretowane w specjalny sposób. +Niektóre znaki mają specjalne znaczenie i są zapisywane w kwadratowych nawiasach. +Metaznaki to: + +|Metaznaki|Opis| +|:----:|----| +|.|Dowolny znak z wyjątkiem nowej linii.| +|[ ]|Zakres. Każdy znak zapisany w kwadratowym nawiasie.| +|[^ ]|Odwrócony zakres. Każdy znak, który nie znajduje się w kwadratowym nawiasie.| +|*|0 lub więcej poprzedzających znaków.| +|+|1 lub więcej poprzedzających znaków.| +|?|0 lub 1 poprzedzających znaków.| +|{n,m}|Minimum "n" ale nie więcej niż "m" poprzedzających znaków.| +|(xyz)|Grupowanie znaków. Znaki xyz dokładnie w tej kolejności.| +|||Alternatywa. Znaki przed symbolem lub za symbolem.| +|\|Znak ucieczki. Umożliwia używanie zarezerwowanych znaków [ ] ( ) { } . * + ? ^ $ \ |.| +|^|Oznacza początek wzorca.| +|$|Oznacza koniec wzorca.| + +## 2.1 Kropka + +Kropka `.` jest najprostszym przykładem metaznaku. Oznacza dowolny znak z wyłączeniem entera +i znaków nowej linii. Na przykład, wyrażenie regularne `.ar` oznacza: dowolny znak, następującą +po niej literę `a`, następującą po niej literę `r`. + +
+".ar" => The car parked in the garage.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/xc9GkU/1) + +## 2.2 Zestaw znaków + +Zestawy znaków nazywane też klasami znaków. Nawiasy kwadratowe służą do określenia zestawów znaków. +Użycie myślnika wewnątrz zestawu, określa jego zakres. Kolejność znaków w nawiasach kwadratowych +nie ma znaczenia. Na przykład wyrażenie `[Tt]he` oznacza: dużą literę `T` lub małą `t`, +następującą po niej literę `h`, następującą po niej literę `e`. + +
+"[Tt]he" => The car parked in the garage.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/2ITLQ4/1) + +Jednak kropka w zestawie znaków, oznacza dosłownie kropkę. Wyrażenie regularne +`ar[.]` oznacza: małą literę `a`, następującą po niej literę `r`, +następującą po niej `.` kropkę. + +
+"ar[.]" => A garage is a good place to park a car.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/wL3xtE/1) + +### 2.2.1 Odwrócony zestaw znaków + +Generalnie znak karety oznacza początek wyrażenia, ale gdy zostanie użyty zaraz +za otwierającym nawiasem kwadratowym, odwraca zestaw znaków. Na przykład +wyrażenie `[^c]ar` oznacza: każdy znak z wyjątkiem `c`, +następującą po niej literę `a`, następującą po niej literę `r`. + +
+"[^c]ar" => The car parked in the garage.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/nNNlq3/1) + +## 2.3 Powtórzenia + +Następujące metaznaki `+`, `*` czy `?` określają ile razy wzorzec może się powtórzyć. +Te metaznaki zachowują się różnie, w zależności od sytuacji. + +### 2.3.1 Gwiazdka + +Symbol `*` oznacza zero lub więcej powtórzeń poprzedzających znaków. Wyrażenie +regularne `a*` oznacza: zero lub więcej powtórzeń poprzedzającej małej +litery `a`. Ale jeśli występuje po zestawie znaków lub klasie, to oznacza +powtórzenia całego zestawu lub klasy. Na przykład, wyrażenie regularne +`[a-z]*` oznacza: każdy ciąg znaków pisany małymi literami. + +
+"[a-z]*" => The car parked in the garage #21.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/7m8me5/1) + +Symbol `*` może być użyty z metaznakiem `.` by oznaczyć każdy łańcuch +znaków `.*`. Symbol `*` może być użyty ze znakiem `\s` +by znaleźć łańcuch zawierający spacje. Na przykład, wyrażenie +`\s*cat\s*` oznacza: zero lub więcej spacji, następującą po niej małą literę `c`, +następującą po niej małą literę `a`, następującą po niej małą literę `t`, +następujące po niej zero lub więcej spacji. + +
+"\s*cat\s*" => The fat cat sat on the concatenation.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/gGrwuz/1) + +### 2.3.2 Plus + +Symbol `+` oznacza jeden lub więcej powtórzeń poprzedzających znaków. Na przykład, +wyrażenie `c.+t` oznacza: małą literę `c`, następujący po niej przynajmniej jeden +dowolny znak, następującą po nim małą literę `t`. W tym wypadku `t` jest ostatnim +`t` w zdaniu. + +
+"c.+t" => The fat cat sat on the mat.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/Dzf9Aa/1) + +### 2.3.3 Znak zapytania + +W wyrażeniach regularnych znak `?` sprawia, że poprzedzający znak jest opcjonalny. +Ten symbol oznacza zero lub jedno wystąpienie poprzedzającego znaku. Na przykład, +wyrażenie regularne `[T]?he` oznacza: opcjonalną dużą literę `T`, następującą +po niej małą literę `h`, następującą po niej małą literę `e`. + +
+"[T]he" => The car is parked in the garage.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/cIg9zm/1) + +
+"[T]?he" => The car is parked in the garage.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/kPpO2x/1) + +## 2.4 Klamry + +W wyrażeniach regularnych, klamry zwane również kwantyfikatorami, używane są +do określenia, ile razy znak lub grupa znaków może się powtórzyć. +Na przykład wyrażenie regularne `[0-9]{2,3}` oznacza: przynajmniej +2 znaki, ale nie więcej niż 3 (znaki z zakresu od 0 do 9). + +
+"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/juM86s/1) + +Możemy opuścić drugą liczbę. Na przykład regularne wyrażenie `[0-9]{2,}` +oznacza: 2 lub więcej znaków. Jeżeli dodatkowo usuniemy przecinek, +to wyrażenie `[0-9]{3}` oznacza: dokładnie 3 znaki z zakresu 0 do 9. + +
+"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/Gdy4w5/1) + +
+"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/Sivu30/1) + +## 2.5 Grupa znaków + +Grupa znaków to grupa podwzorców, które zapisywane są w nawiasach `(...)`. +Jak wspominaliśmy wyżej, jeśli w wyrażeniu regularnym wstawimy kwantyfikator po +znaku, wtedy powtórzy on ten znak. Ale gdy wstawimy kwantyfikator po grupie znaków, +wtedy cała grupa zostanie powtórzona. Na przykład wyrażenie regularne `(ab)*` +oznacza zero lub więcej powtórzeń grupy "ab". Możemy także użyć metaznaku +alternatywy `|` wewnątrz grupy. Na przykład wyrażenie `(c|g|p)ar` oznacza: małą literę `c`, +`g` lub `p`, następującą po niej literę `a`, następującą po niej literę `r`. + +
+"(c|g|p)ar" => The car is parked in the garage.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/tUxrBG/1) + +## 2.6 Alternatywa + +W wyrażeniach regularnych pionowa kreska `|` oznacza alternatywę. +Działa jak warunek pomiędzy różnymi wyrażeniami. Teraz możesz pomyśleć, że +to działa tak samo jak zestaw znaków. Różnica polega na tym, że zestaw znaków +działa na poziomie znaków, natomiast alternatywa na poziomie wyrażenia. Na przykład +wyrażenie regularne `(T|t)he|car` oznacza: dużą literę `T` lub małą `t`, +następującą po niej literę `h`, następującą po niej literę `e` lub `c`, następującą +po niej literę `a`, następującą po niej literę `r`. + +
+"(T|t)he|car" => The car is parked in the garage.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/fBXyX0/1) + +## 2.7 Znak ucieczki + +Ukośnik `\` w wyrażeniach regularnych jest znakiem ucieczki. Pozwala on +używać w wyrażeniu zarezerwowanych znaków takich jak `{ } [ ] / \ + * . $ ^ | ?`. +Aby użyć znaku specjalnego w wyrażeniu, postaw `\` przed nim. + +Na przykład wyrażenie `.` dopasowuje każdy znak z wyjątkiem nowej linii. +Żeby dopasować kropkę `.` w wyrażeniu regularnym, trzeba wstawić przed nią ukośnik. +Wyrażenie `(f|c|m)at\.?` oznacza: małe litery `f` lub `c` lub `m`, następującą po niej +literę `a`, następującą po niej literę `t`, następującą kropkę `.`, która jest opcjonalna. + +
+"(f|c|m)at\.?" => The fat cat sat on the mat.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/DOc5Nu/1) + +## 2.8 Kotwice + +W wyrażeniach regularnych używamy kotwic aby sprawdzić czy dopasowywany symbol +jest pierwszym lub ostatnim symbolem w łańcuchu. Są dwa typy: pierwszy to +kareta `^`, która sprawdza czy znak jest początkiem łańcucha, drugi to dolar `$`, +który sprawdza czy znak jest ostatnim elementem łańcucha. + +### 2.8.1 Kareta + +Kareta `^` sprawdza czy znak jest początkiem łańcucha. Jeżeli użyjemy takiego +wyrażenia `^a` (jeśli a jest pierwszym znakiem) na łańcuchu `abc` to dopasuje +nam `a`. Ale jeśli użyjemy takiego wyrażenia `^b` na tym samym łańcuchu, to nie +zwróci nam nic. Ponieważ w łańcuchu `abc` "b" nie jest pierwszym symbolem. +Spójrzmy teraz na wyrażenie `^(T|t)he` które oznacza: dużą literę `T` lub małą +`t`, która jest początkiem łańcucha, następującą po niej literę `h`, następującą +po niej literę `e`. + +
+"(T|t)he" => The car is parked in the garage.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/5ljjgB/1) + +
+"^(T|t)he" => The car is parked in the garage.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/jXrKne/1) + +### 2.8.2 Dolar + +Symbol dolara `$` używany jest do sprawdzenia czy dopasowywany znak jest ostatni +w łańcuchu. Na przykład, wyrażenie regularne `(at\.)$` oznacza: małą literę `a`, +następującą po niej literę `t`, następującą po niej kropkę `.` i na dodatek +dopasowanie musi być końcem łańcucha. + +
+"(at\.)" => The fat cat. sat. on the mat.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/y4Au4D/1) + +
+"(at\.)$" => The fat cat. sat. on the mat.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/t0AkOd/1) + +## 3. Skróty + +W wyrażeniach regularnych znajdziemy także skróty dla popularnych zestawów znaków, +które ułatwiają pracę z wyrażeniami regularnymi. Skróty wyglądają następująco: + +|Skrót|Opis| +|:----:|----| +|.|Każdy znak z wyjątkiem nowej linii| +|\w|Znaki alfanumeryczne: `[a-zA-Z0-9_]`| +|\W|Znaki nie alfanumeryczne: `[^\w]`| +|\d|Cyfry: `[0-9]`| +|\D|Nie cyfry: `[^\d]`| +|\s|Dowolny biały znak: `[\t\n\f\r\p{Z}]`| +|\S|Każdy znak oprócz białych: `[^\s]`| + +## 4. Lookaround + +Lookbehind i lookahead (nazywane również lookaround) to specyficzne typy +***niezwracających grup*** (dopasowują wzorzec, ale nie zwracają wartości). +Lookaround używane są w sytuacji, gdy mamy wzorzec i jest on poprzedzony innym wzorcem, +lub następuje po nim kolejny wzorzec. Na przykład, chcemy mieć wszystkie +numery, które są poprzedzone znakiem `$` w takim łańcuchu `$4.44 and $10.88`. +Użyjemy takiego wyrażenia regularnego `(?<=\$)[0-9\.]*` które oznacza: znajdź +wszystkie liczby ze znakiem `.` poprzedzone znakiem `$`. W wyrażeniach regularnych +wyróżniamy: + +|Symbol|Opis| +|:----:|----| +|?=|Lookahead| +|?!|Odwrócony lookahead| +|?<=|Lookbehind| +|? +"(T|t)he(?=\sfat)" => The fat cat sat on the mat. + + +[Przetestuj wyrażenie](https://regex101.com/r/IDDARt/1) + +### 4.2 Odwrócony lookahead + +Używany jest, gdy potrzebujemy dopasowania z łańcucha, po których nie następują +żadne wzorce. Odwrócony lookahead definiujemy w nawiasach, stosując znak negacji +`!` po znaku zapytania, na przykład: `(?!...)`. Popatrzmy na następujące wyrażenie +`(T|t)he(?!\sfat)` które oznacza: znajdź wszystkie słowa `The` lub `the` w łańcuchu, +po których nie następuje słowo `fat`, poprzedzone spacją. + +
+"(T|t)he(?!\sfat)" => The fat cat sat on the mat.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/V32Npg/1) + +### 4.3 Lookbehind + +Lookbehind używany jest do odnalezienia wszystkich dopasowań poprzedzonych konkretnym +wzorcem. Wyrażenie lookbehind zapisujemy tak: `(?<=...)`. Na przykład, wyrażenie +`(?<=(T|t)he\s)(fat|mat)` oznacza: znajdź wszystkie słowa `fat` lub `mat` w łańcuchu, +które znajdują się po słowach `The` lub `the`. + +
+"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/avH165/1) + +### 4.4 Odwrócony lookbehind + +Odwrócony używany jest do odnalezienia wszystkich dopasowań niepoprzedzonych konkretnym +wzorcem. Odwrócony lookbehind zapisujemy tak: `(? +"(?<!(T|t)he\s)(cat)" => The cat sat on cat. + + +[Przetestuj wyrażenie](https://regex101.com/r/8Efx5G/1) + +## 5. Flagi + +Flagi nazywane są także modyfikatorami, ponieważ zmieniają wynik wyrażenia regularnego. +Flagi mogą być używane w każdej kombinacji i są integralną częścią wyrażeń regularnych. + +|Flaga|Opis| +|:----:|----| +|i|Wielkość znaków: Sprawia, że dopasowanie nie jest wrażliwe na wielkość znaków.| +|g|Przeszukanie globalne: Wyszukiwanie wzorca w całym łańcuchu.| +|m|Multilinia: Sprawia, że kotwice działają na każdej linii.| + +### 5.1 Wielkość znaków + +Modyfikator `i` używany jest, gdy wielkość liter nie ma znaczenia. Na przykład +wyrażenie `/The/gi` oznacza: dużą literę `T`, następującą po niej literę `h`, +następującą po niej literę `e`. A na końcu wyrażenia, flaga `i` żeby ignorować +wielkość znaków. Jak widać, została też użyta flaga `g` ponieważ chcemy przeszukać +cały łańcuch. + +
+"The" => The fat cat sat on the mat.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/dpQyf9/1) + +
+"/The/gi" => The fat cat sat on the mat.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/ahfiuh/1) + +### 5.2 Przeszukiwanie globalne + +Modyfikator `g` używany jest do przeszukiwania całego łańcucha (znajdź wszystko, +a nie tylko zatrzymuj się na pierwszym). Na przykład wyrażenie `/.(at)/g` +oznacza: każdy znak z wyjątkiem nowej linii, następującą po nim literę `a`, +następującą po niej literę `t`. Ponieważ użyliśmy na końcu wyrażenia flagi `g`, +wyszukane zostaną wszystkie dopasowania w łańcuchu, a nie tylko pierwszy (domyślne zachowanie). + +
+"/.(at)/" => The fat cat sat on the mat.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/jnk6gM/1) + +
+"/.(at)/g" => The fat cat sat on the mat.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/dO1nef/1) + +### 5.3 Multilinia + +Modyfikator `m` używany jest do dopasowywania w wielu liniach. Jak wspominaliśmy +wcześniej, kotwice `(^, $)` używane są do sprawdzania czy wzorzec jest początkiem +lub końcem łańcucha. Jeśli chcemy, żeby kotwice zadziałały w każdej linii, używamy +wtedy flagi `m`. Na przykład wyrażenie `/at(.)?$/gm` oznacza: małą literę `a`, +następującą po niej małą literę `t`, opcjonalnie dowolny znak z wyjątkiem nowej linii. +I ponieważ użyliśmy flagi `m` dopasowywane będą wzorce na końcu każdej linii w łańcuchu. + +
+"/.at(.)?$/" => The fat
+                cat sat
+                on the mat.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/hoGMkP/1) + +
+"/.at(.)?$/gm" => The fat
+                  cat sat
+                  on the mat.
+
+ +[Przetestuj wyrażenie](https://regex101.com/r/E88WE2/1) + +## Kontrybucja + +* Zgłaszanie błędów +* Otwieranie pull request z poprawkami +* Dzielenie się poradnikiem +* Skontaktuj się ze mną ziishaned@gmail.com lub [![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/ziishaned.svg?style=social&label=Follow%20%40ziishaned)](https://twitter.com/ziishaned) + +## Licencja + +MIT © [Zeeshan Ahmed](mailto:ziishaned@gmail.com) diff --git a/README-pt_BR.md b/README-pt_BR.md index de90728..791c48c 100644 --- a/README-pt_BR.md +++ b/README-pt_BR.md @@ -13,6 +13,7 @@ * [日本語](README-ja.md) * [한국어](README-ko.md) * [Greek](README-gr.md) +* [Polish](README-pl.md) ## O que é uma Expressão Regular? diff --git a/README-tr.md b/README-tr.md index 956e85e..718849b 100644 --- a/README-tr.md +++ b/README-tr.md @@ -13,6 +13,7 @@ * [한국어](README-ko.md) * [Turkish](README-tr.md) * [Greek](README-gr.md) +* [Polish](README-pl.md) ## Düzenli İfade Nedir? diff --git a/README.md b/README.md index 443973e..29f1d4c 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ * [한국어](README-ko.md) * [Turkish](README-tr.md) * [Greek](README-gr.md) +* [Polish](README-pl.md) ## What is Regular Expression? diff --git a/img/regexp-pl.png b/img/regexp-pl.png new file mode 100644 index 0000000000000000000000000000000000000000..5da2cd423c715a7ca33f218c5918d70345868398 GIT binary patch literal 20204 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 literal 0 HcmV?d00001