From ff3808ed94832e3a5c4176eee2be049e26f107eb Mon Sep 17 00:00:00 2001 From: binafor Date: Tue, 15 Aug 2017 11:18:41 +0800 Subject: [PATCH 01/36] fix typo (#49) --- README-cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README-cn.md b/README-cn.md index 483986c..84cc721 100644 --- a/README-cn.md +++ b/README-cn.md @@ -469,7 +469,7 @@ * *整数*: `^-?\d+$` * *用户名*: `^[\w\d_.]{4,16}$` * *数字和英文字母*: `^[a-zA-Z0-9]*$` -* *数字和应为字母和空格*: `^[a-zA-Z0-9 ]*$` +* *数字和英文字母和空格*: `^[a-zA-Z0-9 ]*$` * *密码*: `^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$` * *邮箱*: `^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})*$` * *IP4 地址*: `^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*$` From 02dd4cdb5310b6bc7fe89d0e8ac2bd59d81f30ae Mon Sep 17 00:00:00 2001 From: Emmanuel Arias Date: Wed, 16 Aug 2017 00:23:22 -0300 Subject: [PATCH 02/36] Add spanish version (#52) * [WIP] Add spanish version * Spanish translation finished. Ready for merge --- README-es.md | 483 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 138 +++++++-------- 2 files changed, 552 insertions(+), 69 deletions(-) create mode 100644 README-es.md diff --git a/README-es.md b/README-es.md new file mode 100644 index 0000000..24e8643 --- /dev/null +++ b/README-es.md @@ -0,0 +1,483 @@ +
+

+Learn Regex +


+ +## Translations: + +* [English](README.md) +* [中文版](README-cn.md) +* [Español](README-es.md) + +## What is Regular Expression? +> 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. + +Una expresión regular es un patrón que que se compara con una cadena de caracteres de izquierda a derecha. La palabra "expresión regular", puede también ser escrita como "Regex" o "Regexp". Las expresiones regulares se utiliza para remplazar un texto, dentro de un *string* (o cadena de caracteres), validar el formato, extraer un substring de un string completo basado en la coincidencia de una patrón, y muchas cosas más. + +Imagina que estas escribiendo una aplicación y quieres agregar reglas para cuando el usuario elija su nombre de usuario. Nosotros vamos a querer que el nombre de usuario contenga letras, números, guión bajo, y guíon medio. También vamos a querer limitar el número de caracteres en el nombre de usuario para que no se vea feo. Para ello usamos la siguiente expresión regular para validar el nombre de usuario + + +

+

+Regular expression +

+ +De la expresión regular anterior, se puede aceptar las cadenas 'john_doe', 'jo-hn_doe' y 'john12_as'. La expresión no coincide con el nombre de usuario 'Jo', porque es una cadena de caracteres que contiene letras mayúsculas y es demasiado corta. + +## Tabla de contenido + +- [Introducción](#1-introduccion) +- [Meta caracteres](#2-meta-caracteres) + - [Full stop](#21-full-stop) + - [Conjunto de caracteres](#22-conjunto-de-caracteres) + - [Conjunto de caracteres negados](#221-conjunto-de-caracteres-negado) + - [Repeticiones](#23-repeticiones) + - [Asterísco](#231-asterisco) + - [Signo más](#232-signo-mas) + - [Signo de pregunta](#233-signo-de-pregunta) + - [Llaves](#24-llaves) + - [Grupo de caracteres](#25-grupo-de-caracteres) + - [Alternancia](#26-alternacia) + - [Caracteres especiales de escape](#27-caracteres-especiales-de-escape) + - [Anclas](#28-anclas) + - [Símbolo de intercalación](#281-simbolo-de-intercalacion) + - [Símbolo dolar](#282-simbolo-dolar) +- [Conjunto de caracteres abreviados](#3-conjunto-de-caracteres-abreviados) +- [Mirar alrededor](#4-mirar-alrededor) + - [Mirar hacia delante positivo](#41-mirar-hacia-delante-positivo) + - [Mirar hacia delante negativo](#41-mirar-hacia-delaten-negativo) + - [Mirar hacia atrás positivo](#41-mirar-hacia-atras-positivo) + - [Mirar hacia atrás negativo](#41-mirar-hacia-atras-negativo) +- [Banderas](#5-banderas) + - [mayúsculas y minúsculas](#51-mayusculas-y-minusculas) + - [Búsqueda global](#52-busqueda-global) + - [Multilinea](#53-multilinea) +- [Bonus](#bonus) + +## 1. Introducción + +Una expresión regular es sólo un patrón de caracteres que utilizamos para realizar búsquedas en un texto. Por ejemplo, la expresión regular «the» significa: la letra `t` seguida de la letra `h` seguida de la letra `e`. + +
+"the" => The fat cat sat on the mat.
+
+ +[Prueba la expresión regular](https://regex101.com/r/dmRygT/1) + +La expresión regular `123` coincide con la cadena `123`. La expresión regular se compara con una cadena de entrada al comparar cada carácter de la expresión regular con cada carácter de la cadena de entrada, uno tras otro. Las expresiones regulares son normalmente sensibles a mayúsculas y minúsculas, por lo que la expresión regular `The` no coincide con la cadena `the`. + +
+"The" => The fat cat sat on the mat.
+
+ +[Prueba la expresión regular](https://regex101.com/r/1paXsy/1) + +## 2. Meta caracteres + +Los caracteres meta son los bloques de construcción de las expresiones regulares. Los meta caracteres no se sostienen a sí mismos, sino que se interpretan de alguna manera especial. Algunos meta caracteres tienen un significado especial y se escriben entre corchetes. Los meta caracteres son los siguientes: + +|Meta character|Description| +|:----:|----| +|.|Periodo. Coincide con cualquier caracter excepto un salto de línea.| +|[ ]|Clase caracter. Coincide con cualquier caracter contenido entre corchetes.| +|[^ ]|Clase caracter negado. Coincide con cualquier caracter que no está contenido dentro de los corchetes.| +|*|Corresponde con 0 o más repeticiones del símbolo precedente.| +|+|Corresponde con 1 o más repeticiones del símbolo precedente.| +|?|Hace que el símbolo precedente sea opcional.| +|{n,m}|Llaves.Corresponde al menos "n" pero no más de "m" repeticiones del símbolo precedente.| +|(xyz)|Grupo caracter. Hace coincidir los caracteres xyz en ese orden exacto.| +|||Alternancia. Corresponde a los caracteres anteriores o los caracteres después del símbolo.| +|\|Escapa el siguiente caracter. Esto le permite hacer coincidir los caracteres reservados [ ] ( ) { } . * + ? ^ $ \ || +|^|Hace coincidir el principio de la entrada.| +|$|Corresponde al final de la entrada.| + +## 2.1 Full stop + +Full stop `.` es el ejemplo más simple del meta-caracter. El caracter meta "." coincide con cualquier carácter. No coincidirá con el retorno o nuevos caracteres de línea. Por ejemplo, la expresión regular `.ar` significa: cualquier caracter, seguido de la letra`a`, seguido de la letra "r". + +
+".ar" => The car parked in the garage.
+
+ +[Prueba la expresión regular](https://regex101.com/r/xc9GkU/1) + +## 2.2 Conjunto de caracteres + +Los conjuntos de caracteres también se llaman clase de caracteres. Los corchetes se utilizan para especificar conjuntos de caracteres. Utilice un guión dentro de un conjunto de caracteres para especificar el rango de los caracteres. El orden del rango de caracteres dentro de corchetes no importa. Por ejemplo, la expresión regular "[Tt] he" significa: una letra mayúscula "T" o t, seguida de la letra "h" seguida de la letra "e" + +
+"[Tt]he" => The car parked in the garage.
+
+ +[Prueba la expresión regular](https://regex101.com/r/2ITLQ4/1) + +Sin embargo, un período dentro de un conjunto de caracteres significa un período literal. La expresión regular `ar [.]` Significa: un carácter minúsculo `a`, seguido de la letra` r`, seguido de un carácter `.`. + +
+"ar[.]" => A garage is a good place to park a car.
+
+ +[Prueba la expresión regular](https://regex101.com/r/wL3xtE/1) + +### 2.2.1 Conjunto de caracteres negados + +En general, el símbolo de intercalación representa el comienzo de la cadena, pero cuando se escribe después del corchete de apertura niega el conjunto de caracteres. Por ejemplo, la expresión regular `[^c] ar` significa: cualquier carácter, excepto `c`, seguido del carácter `a`, seguido de la letra `r`. + +
+"[^c]ar" => The car parked in the garage.
+
+ +[Prueba la expresión regular](https://regex101.com/r/nNNlq3/1) + +## 2.3 Repeticiones + +Siguiendo los caracteres meta +, * o ?, se utilizan para especificar cuántas veces puede producirse un subpatrón. Estos meta-caracteres actúan de manera diferente en diferentes situaciones. + +### 2.3.1 Asterísco + +El símbolo `*` coincide con cero o más repeticiones del marcador anterior. La expresión regular `a*` significa: cero o más repeticiones del carácter en minúscula precedente `a`. Pero si aparece después de un conjunto de caracteres o una clase, entonces encuentra las repeticiones de todo el conjunto de caracteres. Por ejemplo, la expresión regular `[a-z]*` significa: cualquier número de letras minúsculas en una fila. + +
+"[a-z]*" => The car parked in the garage #21.
+
+ +[Prueba la expresión regular](https://regex101.com/r/7m8me5/1) + +El símbolo `*` se puede utilizar con el meta-caracter `.` para que coincida con cualquier cadena de caracteres `.*`. El símbolo `*` se lo puede utilizar con el caracter de espacio en blanco `\s` para que coincida con una cadena de caracteres de espacio en blanco. Por ejemplo, la expresión "\s*cat\s*" significa: cero o más espacios, seguido por el carácter en minúscula `c`, seguido del carácter en minúscula `a`, seguido del carácter en minúscula `t`, seguido de cero o más espacios. + +
+"\s*cat\s*" => The fat cat sat on the concatenation.
+
+ +[Prueba la expresión regular](https://regex101.com/r/gGrwuz/1) + +### 2.3.2 Signo más + +El símbolo `+` coincide con una o más repeticiones del carácter anterior. Por ejemplo, la expresión regular `c.+T` significa: letra en minúscula `c`, seguida por al menos uno del mismo carácter, luego el carácter en minúscula `t`. + +
+"c.+t" => The fat cat sat on the mat.
+
+ +[Prueba la expresión regular](https://regex101.com/r/Dzf9Aa/1) + +### 2.3.3 Signo de pregunta + +En expresiones regulares el meta-caracter `?` hace que el caracter precedente sea opcional. Este símnbolo coincide con cero o una instancia del caracter precedente. Por ejemplo, la expresión regular `[T]?he` significa: El caracteropcional predecesor `T` seguido por la letra en minúscula `h`, seguido del caracter en minúscula `e`. + +
+"[T]he" => The car is parked in the garage.
+
+ +[Prueba la expresión regular](https://regex101.com/r/cIg9zm/1) + +
+"[T]?he" => The car is parked in the garage.
+
+ +[Prueba la expresión regular](https://regex101.com/r/kPpO2x/1) + +## 2.4 Llaves + +En la expresión regular, las llaves que también se denominan cuantificadores se utilizan para especificar el número de veces que se puede repetir un carácter o un grupo de caracteres. Por ejemplo, la expresión regular `[0-9]{2,3}` significa: Combina al menos 2 dígitos pero no más de 3 (caracteres del rango de 0 a 9). + +
+"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
+
+ +[Prueba la expresión regular](https://regex101.com/r/juM86s/1) + +Podemos dejar fuera el segundo número. Por ejemplo, la expresión regular `[0-9] {2,}` significa: Combina 2 o más dígitos. Si también eliminamos la coma, la expresión regular `[0-9]{3}` significa: coincidir exactamente con 3 dígitos. + +
+"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
+
+ +[Prueba la expresión regular](https://regex101.com/r/Gdy4w5/1) + +
+"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.
+
+ +[Prueba la expresión regular](https://regex101.com/r/Sivu30/1) + +## 2.5 Grupos de caracteres + +Grupo de caracteres es un grupo de sub-patrones que se escribe dentro de paréntesis `(...)`. Como hemos discutido antes en la expresión regular si ponemos un cuantificador después de un caracter, repetiremos el caracter anterior. Pero si ponemos cuantificador después de un grupo de caracteres, entonces repetimos todo el grupo de caracteres. Por ejemplo, la expresión regular `(ab)*` coincide con cero o más repeticiones del caracter "ab". También podemos usar el caracter de alternancia `|` meta dentro del grupo de caracteres. Por ejemplo, la expresión regular `(c|g|p)ar` significa: caracter en minúscula `c`, `g` o `p`, seguido del caracter `a`, seguido del caracter `r`. +
+"(c|g|p)ar" => The car is parked in the garage.
+
+ +[Prueba la expresión regular](https://regex101.com/r/tUxrBG/1) + +## 2.6 Alternancia + +En la expresión regular se usa la barra vertical `|` para definir la alternancia. La alternancia es como una condición entre múltiples expresiones. Ahora, puedes estar pensando que el conjunto de caracteres y la alternancia funciona de la misma manera. Pero la gran diferencia entre el conjunto de caracteres y la alternancia es que el conjunto de caracteres funciona a nivel de caracter pero la alternancia funciona a nivel de expresión. Por ejemplo, la expresión regular `(T|t)he|car` significa: el carcter en mayúscula `T` o en minúscula `t`, seguido del caracter en minúscula `h`, seguido del caracter en minúscula `e` o del caracter en minúscula `c`, seguido de un caracter en minúscula `a`, seguido del carácter en minúscula `r`. + +
+"(T|t)he|car" => The car is parked in the garage.
+
+ +[Prueba la expresión regular](https://regex101.com/r/fBXyX0/1) + +## 2.7 Caracteres especiales de escape + +La barra invertida `\` se utiliza en la expresión regular para escapar del carácter siguiente. Esto permite especificar un símbolo como un caracter coincidente incluyendo caracteres reservados `{}[]/\+*.^|?`. Por ejemplo, la expresión regular `.` se utiliza para coincidir con cualquier caracter, excepto la nueva línea. Ahora, para emparejar `.` en una cadena de entrada, la expresión regular `(f|c|m)at\.?` significa: la letra minúscula `f`, `c` o `m`, seguida del caracter en minúscula `a`, seguido de la letra minúscula `t`, seguida del caracter opcional `.`. + +
+"(f|c|m)at\.?" => The fat cat sat on the mat.
+
+ +[Prueba la expresión regular](https://regex101.com/r/DOc5Nu/1) + +## 2.8 Anclas + +En expresiones regulares, usamos anclas para comprobar si el símbolo de coincidencia es el símbolo inicial o el símbolo final de la cadena de entrada. Los anclajes son de dos tipos: El primer tipo es el símbolo `^` que comprueba si el caracter coincidente es el caracter inicial de la entrada y el segundo tipo es Dollar `$` que comprueba si el caracter coincidente es el último caracter de la cadena de entrada. + +### 2.8.1 Simbolo de intercalación + +El símbolo de intercalación `^` se usa para verificar si el caracter coincidente es el primer caracter de la cadena de entrada. Si aplicamos la siguiente expresión regular `^a` (si a es el símbolo inicial) a la cadena de entrada `abc` coincide con `a`. Pero si aplicamos la expresión regular `^b` en la cadena de entrada anterior, no coincide con nada. Porque en la cadena de entrada `abc` "b" no es el símbolo inicial. Vamos a echar un vistazo a otra expresión regular `^(T|t)he`, significa: mayúsculas `T` o la letra minúscula `t` es el símbolo inicial de la cadena de entrada, seguido del caracter minúscula `h` y seguido del caracter en minúscula `e`. + +
+"(T|t)he" => The car is parked in the garage.
+
+ +[Prueba la expresión regular](https://regex101.com/r/5ljjgB/1) + +
+"^(T|t)he" => The car is parked in the garage.
+
+ +[Prueba la expresión regular](https://regex101.com/r/jXrKne/1) + +### 2.8.2 Símbolo dolar + +El símbolo de dólar `$` se utiliza para comprobar si el caracter coincidente es el último carácter de la cadena de entrada. Por ejemplo, la expresión regular `(at\.)$` significa: un caracter en minúscula `a`, seguido del caracter en minúscula `t` seguido de un carácter `.` y el marcador debe ser el final de la cadena. + +
+"(at\.)" => The fat cat. sat. on the mat.
+
+ +[Prueba la expresión regular](https://regex101.com/r/y4Au4D/1) + +
+"(at\.)$" => The fat cat. sat. on the mat.
+
+ +[Pueba la expresión regular](https://regex101.com/r/t0AkOd/1) + +## 3. Conjunto de caracteres abreviados + +La expresión regular proporciona abreviaturas para los conjuntos de caracteres +comúnmente utilizados, que ofrecen abreviaturas convenientes para expresiones +regulares de uso común. Los conjuntos de caracteres abreviados son los siguientes: + +|Shorthand|Description| +|:----:|----| +|.|Cualquier caracter excepto la nueva línea| +|\w|Coincide con los caracteres alfanuméricos: `[a-zA-Z0-9_]`| +|\W|Coincide con los caracteres no alfanuméricos: `[^\w]`| +|\d|Coincide con dígitos: `[0-9]`| +|\D|Coincide con no dígitos: `[^\d]`| +|\s|Coincide con caracteres espaciales: `[\t\n\f\r\p{Z}]`| +|\S|Coincide con caracteres no espaciales: `[^\s]`| + +## 4. Mirar alrededor + +Mirar hacia delante (lookaheds) y mirar hacia atrás (Lookbehind) a veces conocidos +como lookaround son tipo específico de ***grupo que no captura*** (Utilice para +coincidir con el patrón pero no se incluye en la lista correspondiente). Los +lookaheads se usan cuando tenemos la condición de que este patrón es precedido o +seguido por otro patrón determinado. Por ejemplo, queremos obtener todos los números +que están precedidos por el carácter `$` de la siguiente cadena de entrada +`$4.44 y $10.88`. Usaremos la siguiente expresión regular `(?<=\$)[0-9\.] *`, +esto significa: obtener todos los números que contienen el carácter `.` y +están precedidos del carácter `$`. A continuación se muestran los lookarounds +que se utilizan en expresiones regulares: + +|Symbol|Description| +|:----:|----| +|?=|Positive Lookahead| +|?!|Negative Lookahead| +|?<=|Positive Lookbehind| +|? +"[T|t]he(?=\sfat)" => The fat cat sat on the mat. + + +[Prueba la expresión regular](https://regex101.com/r/IDDARt/1) + +### 4.2 Mirar hacia adelate negativa + +El lookahead negativo se usa cuando necesitamos obtener todas las coincidencias +de la cadena de entrada que no son seguidas por un patrón. El aspecto negativo se +define de la misma manera que definimos el aspecto positivo, pero la única diferencia +es que en lugar del caracter igual `=` utilizamos la negción `!` , es decir, +`(?! ...)`. Vamos a echar un vistazo a la siguiente expresión regular `[T|t]he(?!\Sfat)` +que significa: obtener todas las `The` o `the` seguidos por la palabra `fat` precedido por un carácter de espacio. + + +
+"[T|t]he(?!\sfat)" => The fat cat sat on the mat.
+
+ +[Prueba la expresión](https://regex101.com/r/V32Npg/1) + +### 4.3 Mirar hacia atras positiva + +Positivo lookbehind se utiliza para obtener todos los caracteres que están precedidos +por un patrón específico. La apariencia positiva se denomina `(?<=...)`. +Por ejemplo, la expresión regular `(? <= [T|t]he\s)(fat|mat)` significa: obtener todas las palabras +`fat` o `mat` de la cadena de entrada después de la palabra `The` o `the`. + +
+"(?<=[T|t]he\s)(fat|mat)" => The fat cat sat on the mat.
+
+ +[Prueba la expresión regular](https://regex101.com/r/avH165/1) + +### 4.4 Mirar hacia atras negativa + +El lookbehind negativo se utiliza para obtener todas las coincidencias que no +están precedidas por un patrón específico. El lookbehind negativo se denota por +`(? +"(?<![T|t]he\s)(cat)" => The cat sat on cat. + + +[Prueba la expresión regular](https://regex101.com/r/8Efx5G/1) + +## 5. Banderas + +Los indicadores también se llaman modificadores porque modifican la salida +de una expresión regular. Estos indicadores se pueden utilizar en cualquier orden +o combinación, y son una parte integral de RegExp. + + +|Bandera|Descripción| +|:----:|----| +|i|Insensible a mayúsculas y minúsculas: ajusta la coincidencia para que no distinga mayúsculas y minúsculas.| +|g|Búsqueda global: busque un patrón en toda la cadena de entrada.| +|m|Multilinea: Ancla meta caracter trabaja en cada linea.| + +### 5.1 Mayúscula y minúscula + +El modificador `i` se utiliza para realizar la coincidencia entre mayúsculas y +minúsculas. Por ejemplo, la expresión regular `/The/gi` significa: letra mayúscula +`T`, seguido del caracter en minúscula `h`, seguido del carácter `e`. Y al final +de la expresión regular, el indicador `i` indica al motor de expresiones +regulares que ignore el caso. Como puede ver, también ofrecemos el indicador +`g` porque queremos buscar el patrón en toda la cadena de entrada. + + +
+"The" => The fat cat sat on the mat.
+
+ +[Prueba la expresión regularn](https://regex101.com/r/dpQyf9/1) + +
+"/The/gi" => The fat cat sat on the mat.
+
+ +[Prueba la expresión regular](https://regex101.com/r/ahfiuh/1) + +### 5.2 Búsqueda global + +El modificador `g` se utiliza para realizar una coincidencia global +(encontrar todos las coincidencias en lugar de detenerse después de la primera coincidencia). +Por ejemplo, la expresión regular `/.(At)/g` significa: cualquier carácter, +excepto la nueva línea, seguido del caracter minúsculo `a`, seguido del caracter +en minúscula `t`. Debido a que siempre `g` prevee la bandera al final de la expresión +regular ahora encontrará todas las coincidencias de toda la cadena de entrada. + + +
+"/.(at)/" => The fat cat sat on the mat.
+
+ +[Prueba la expresión regular](https://regex101.com/r/jnk6gM/1) + +
+"/.(at)/g" => The fat cat sat on the mat.
+
+ +[Prueba la expresión regular](https://regex101.com/r/dO1nef/1) + +### 5.3 Multilinea + +El modificador `m` se utiliza para realizar una coincidencia de varias líneas. +Como analizamos anteriormente, las anclas `(^,$)` se utilizan para comprobar si +el patrón es el comienzo de la entrada o el final de la cadena de entrada. Pero +si queremos que las anclas funcionen en cada línea usamos la bandera `m`. +Por ejemplo, la expresión regular `/at(.)?$/Gm` +significa: caracter en minúscula` a`, seguido del caracter minúsculo `t`, +opcionalmente cualquier cosa menos la nueva línea. Y debido a `m` bandera ahora +el motor de expresión regular coincide con el patrón al final de cada línea de una cadena. + +
+"/.at(.)?$/" => The fat
+                cat sat
+                on the mat.
+
+ +[Prueba la expresión regular](https://regex101.com/r/hoGMkP/1) + +
+"/.at(.)?$/gm" => The fat
+                  cat sat
+                  on the mat.
+
+ +[Prueba la expresión regular](https://regex101.com/r/E88WE2/1) + +## Bonus + +* *Positive Integers*: `^\d+$` +* *Negative Integers*: `^-\d+$` +* *US Phone Number*: `^+?[\d\s]{3,}$` +* *US Phone with code*: `^+?[\d\s]+(?[\d\s]{10,}$` +* *Integers*: `^-?\d+$` +* *Username*: `^[\w.]{4,16}$` +* *Alpha-numeric characters*: `^[a-zA-Z0-9]*$` +* *Alpha-numeric characters with spaces*: `^[a-zA-Z0-9 ]*$` +* *Password*: `^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$` +* *email*: `^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})*$` +* *IPv4 address*: `^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*$` +* *Lowercase letters only*: `^([a-z])*$` +* *Uppercase letters only*: `^([A-Z])*$` +* *URL*: `^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$` +* *VISA credit card numbers*: `^(4[0-9]{12}(?:[0-9]{3})?)*$` +* *Date (DD/MM/YYYY)*: `^(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}$` +* *Date (MM/DD/YYYY)*: `^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$` +* *Date (YYYY/MM/DD)*: `^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$` +* *MasterCard credit card numbers*: `^(5[1-5][0-9]{14})*$` +* *Hashtags*: Including hashtags with preceding text (abc123#xyz456) or containing white spaces within square brackets (#[foo bar]) : `\S*#(?:\[[^\]]+\]|\S+)` +* *@mentions*: `\B@[a-z0-9_-]+` +## Contribution + +* Report issues +* Open pull request with improvements +* Spread the word +* Reach out to me directly at ziishaned@gmail.com or [![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/ziishaned.svg?style=social&label=Follow%20%40ziishaned)](https://twitter.com/ziishaned) + +## License + +MIT © [Zeeshan Ahmed](mailto:ziishaned@gmail.com) diff --git a/README.md b/README.md index 5627cfa..6ea79f7 100644 --- a/README.md +++ b/README.md @@ -11,24 +11,24 @@ ## What is Regular Expression? -> Regular expression is a group of characters or symbols which is used to find a specific pattern from a text. +> Regular expression is a group of characters or symbols which is used to find a specific pattern from a text. -A regular expression is a pattern that is matched against a subject string from left to right. The word "Regular expression" is a -mouthful, you will usually find the term abbreviated as "regex" or "regexp". Regular expression is used for replacing a text within +A regular expression is a pattern that is matched against a subject string from left to right. The word "Regular expression" is a +mouthful, you will usually find the term abbreviated as "regex" or "regexp". Regular expression is used for replacing a text within a string, validating form, extract a substring from a string based upon a pattern match, and so much more. -Imagine you are writing an application and you want to set the rules for when a user chooses their username. We want to -allow the username to contain letters, numbers, underscores and hyphens. We also want to limit the number of +Imagine you are writing an application and you want to set the rules for when a user chooses their username. We want to +allow the username to contain letters, numbers, underscores and hyphens. We also want to limit the number of characters in username so it does not look ugly. We use the following regular expression to validate a username:

Regular expression

-Above regular expression can accept the strings `john_doe`, `jo-hn_doe` and `john12_as`. It does not match `Jo` because that string +Above regular expression can accept the strings `john_doe`, `jo-hn_doe` and `john12_as`. It does not match `Jo` because that string contains uppercase letter and also it is too short. -## Table of Contents +## Table of Contents - [Basic Matchers](#1-basic-matchers) - [Meta character](#2-meta-characters) @@ -60,8 +60,8 @@ contains uppercase letter and also it is too short. ## 1. Basic Matchers -A regular expression is just a pattern of characters that we use to perform search in a text. For example, the regular expression -`the` means: the letter `t`, followed by the letter `h`, followed by the letter `e`. +A regular expression is just a pattern of characters that we use to perform search in a text. For example, the regular expression +`the` means: the letter `t`, followed by the letter `h`, followed by the letter `e`.
 "the" => The fat cat sat on the mat.
@@ -69,7 +69,7 @@ A regular expression is just a pattern of characters that we use to perform sear
 
 [Test the regular expression](https://regex101.com/r/dmRygT/1)
 
-The regular expression `123` matches the string `123`. The regular expression is matched against an input string by comparing each 
+The regular expression `123` matches the string `123`. The regular expression is matched against an input string by comparing each
 character in the regular expression to each character in the input string, one after another. Regular expressions are normally
 case-sensitive so the regular expression `The` would not match the string `the`.
 
@@ -81,8 +81,8 @@ case-sensitive so the regular expression `The` would not match the string `the`.
 
 ## 2. Meta Characters
 
-Meta characters are the building blocks of the regular expressions.  Meta characters do not stand for themselves but instead are 
-interpreted in some special way. Some meta characters have a special meaning and are written inside square brackets. 
+Meta characters are the building blocks of the regular expressions.  Meta characters do not stand for themselves but instead are
+interpreted in some special way. Some meta characters have a special meaning and are written inside square brackets.
 The meta characters are as follows:
 
 |Meta character|Description|
@@ -114,8 +114,8 @@ letter `r`.
 
 ## 2.2 Character set
 
-Character sets are also called character class. Square brackets are used to specify character sets. Use a hyphen inside a character set to 
-specify the characters' range. The order of the character range inside square brackets doesn't matter. For example, the regular 
+Character sets are also called character class. Square brackets are used to specify character sets. Use a hyphen inside a character set to
+specify the characters' range. The order of the character range inside square brackets doesn't matter. For example, the regular
 expression `[Tt]he` means: an uppercase `T` or lowercase `t`, followed by the letter `h`, followed by the letter `e`.
 
 
@@ -134,8 +134,8 @@ A period inside a character set, however, means a literal period. The regular ex
 
 ### 2.2.1 Negated character set
 
-In general, the caret symbol represents the start of the string, but when it is typed after the opening square bracket it negates the 
-character set. For example, the regular expression `[^c]ar` means: any character except `c`, followed by the character `a`, followed by 
+In general, the caret symbol represents the start of the string, but when it is typed after the opening square bracket it negates the
+character set. For example, the regular expression `[^c]ar` means: any character except `c`, followed by the character `a`, followed by
 the letter `r`.
 
 
@@ -146,13 +146,13 @@ the letter `r`.
 
 ## 2.3 Repetitions
 
-Following meta characters `+`, `*` or `?` are used to specify how many times a subpattern can occur. These meta characters act 
-differently in different situations. 
+Following meta characters `+`, `*` or `?` are used to specify how many times a subpattern can occur. These meta characters act
+differently in different situations.
 
 ### 2.3.1 The Star
 
-The symbol `*` matches zero or more repetitions of the preceding matcher. The regular expression `a*` means: zero or more repetitions 
-of preceding lowercase character `a`. But if it appears after a character set or class then it finds the repetitions of the whole 
+The symbol `*` matches zero or more repetitions of the preceding matcher. The regular expression `a*` means: zero or more repetitions
+of preceding lowercase character `a`. But if it appears after a character set or class then it finds the repetitions of the whole
 character set. For example, the regular expression `[a-z]*` means: any number of lowercase letters in a row.
 
 
@@ -161,9 +161,9 @@ character set. For example, the regular expression `[a-z]*` means: any number of
 
 [Test the regular expression](https://regex101.com/r/7m8me5/1)
 
-The `*` symbol can be used with the meta character `.` to match any string of characters `.*`. The `*` symbol can be used with the 
-whitespace character `\s` to match a string of whitespace characters. For example, the expression `\s*cat\s*` means: zero or more 
-spaces, followed by lowercase character `c`, followed by lowercase character `a`, followed by lowercase character `t`, followed by 
+The `*` symbol can be used with the meta character `.` to match any string of characters `.*`. The `*` symbol can be used with the
+whitespace character `\s` to match a string of whitespace characters. For example, the expression `\s*cat\s*` means: zero or more
+spaces, followed by lowercase character `c`, followed by lowercase character `a`, followed by lowercase character `t`, followed by
 zero or more spaces.
 
 
@@ -185,8 +185,8 @@ letter `c`, followed by at least one character, followed by the lowercase charac
 
 ### 2.3.3 The Question Mark
 
-In regular expression the meta character `?` makes the preceding character optional. This symbol matches zero or one instance of 
-the preceding character. For example, the regular expression `[T]?he` means: Optional the uppercase letter `T`, followed by the lowercase 
+In regular expression the meta character `?` makes the preceding character optional. This symbol matches zero or one instance of
+the preceding character. For example, the regular expression `[T]?he` means: Optional the uppercase letter `T`, followed by the lowercase
 character `h`, followed by the lowercase character `e`.
 
 
@@ -203,7 +203,7 @@ character `h`, followed by the lowercase character `e`.
 
 ## 2.4 Braces
 
-In  regular expression braces that are also called quantifiers are used to specify the number of times that a 
+In  regular expression braces that are also called quantifiers are used to specify the number of times that a
 character or a group of characters can be repeated. For example, the regular expression `[0-9]{2,3}` means: Match at least 2 digits but not more than 3 (
 characters in the range of 0 to 9).
 
@@ -213,7 +213,7 @@ characters in the range of 0 to 9).
 
 [Test the regular expression](https://regex101.com/r/juM86s/1)
 
-We can leave out the second number. For example, the regular expression `[0-9]{2,}` means: Match 2 or more digits. If we also remove 
+We can leave out the second number. For example, the regular expression `[0-9]{2,}` means: Match 2 or more digits. If we also remove
 the comma the regular expression `[0-9]{3}` means: Match exactly 3 digits.
 
 
@@ -230,10 +230,10 @@ the comma the regular expression `[0-9]{3}` means: Match exactly 3 digits.
 
 ## 2.5 Character Group
 
-Character group is a group of sub-patterns that is written inside Parentheses `(...)`. As we discussed before that in regular expression 
-if we put a quantifier after a character then it will repeat the preceding character. But if we put quantifier after a character group then 
+Character group is a group of sub-patterns that is written inside Parentheses `(...)`. As we discussed before that in regular expression
+if we put a quantifier after a character then it will repeat the preceding character. But if we put quantifier after a character group then
 it repeats the whole character group. For example, the regular expression `(ab)*` matches zero or more repetitions of the character "ab".
-We can also use the alternation `|` meta character inside character group. For example, the regular expression `(c|g|p)ar` means: lowercase character `c`, 
+We can also use the alternation `|` meta character inside character group. For example, the regular expression `(c|g|p)ar` means: lowercase character `c`,
 `g` or `p`, followed by character `a`, followed by character `r`.
 
 
@@ -244,10 +244,10 @@ We can also use the alternation `|` meta character inside character group. For e
 
 ## 2.6 Alternation
 
-In regular expression Vertical bar `|` is used to define alternation. Alternation is like a condition between multiple expressions. Now, 
-you may be thinking that character set and alternation works the same way. But the big difference between character set and alternation 
-is that character set works on character level but alternation works on expression level. For example, the regular expression 
-`(T|t)he|car` means: uppercase character `T` or lowercase `t`, followed by lowercase character `h`, followed by lowercase character `e` 
+In regular expression Vertical bar `|` is used to define alternation. Alternation is like a condition between multiple expressions. Now,
+you may be thinking that character set and alternation works the same way. But the big difference between character set and alternation
+is that character set works on character level but alternation works on expression level. For example, the regular expression
+`(T|t)he|car` means: uppercase character `T` or lowercase `t`, followed by lowercase character `h`, followed by lowercase character `e`
 or lowercase character `c`, followed by lowercase character `a`, followed by lowercase character `r`.
 
 
@@ -272,17 +272,17 @@ expression `(f|c|m)at\.?` means: lowercase letter `f`, `c` or `m`, followed by l
 
 ## 2.8 Anchors
 
-In regular expressions, we use anchors to check if the matching symbol is the starting symbol or ending symbol of the 
-input string. Anchors are of two types: First type is Caret `^` that check if the matching character is the start 
-character of the input and the second type is Dollar `$` that checks if matching character is the last character of the 
+In regular expressions, we use anchors to check if the matching symbol is the starting symbol or ending symbol of the
+input string. Anchors are of two types: First type is Caret `^` that check if the matching character is the start
+character of the input and the second type is Dollar `$` that checks if matching character is the last character of the
 input string.
 
 ### 2.8.1 Caret
 
-Caret `^` symbol is used to check if matching character is the first character of the input string. If we apply the following regular 
-expression `^a` (if a is the starting symbol) to input string `abc` it matches `a`. But if we apply regular expression `^b` on above 
-input string it does not match anything. Because in input string `abc` "b" is not the starting symbol. Let's take a look at another 
-regular expression `^(T|t)he` which means: uppercase character `T` or lowercase character `t` is the start symbol of the input string, 
+Caret `^` symbol is used to check if matching character is the first character of the input string. If we apply the following regular
+expression `^a` (if a is the starting symbol) to input string `abc` it matches `a`. But if we apply regular expression `^b` on above
+input string it does not match anything. Because in input string `abc` "b" is not the starting symbol. Let's take a look at another
+regular expression `^(T|t)he` which means: uppercase character `T` or lowercase character `t` is the start symbol of the input string,
 followed by lowercase character `h`, followed by lowercase character `e`.
 
 
@@ -299,8 +299,8 @@ followed by lowercase character `h`, followed by lowercase character `e`.
 
 ### 2.8.2 Dollar
 
-Dollar `$` symbol is used to check if matching character is the last character of the input string. For example, regular expression 
-`(at\.)$` means: a lowercase character `a`, followed by lowercase character `t`, followed by a `.` character and the matcher 
+Dollar `$` symbol is used to check if matching character is the last character of the input string. For example, regular expression
+`(at\.)$` means: a lowercase character `a`, followed by lowercase character `t`, followed by a `.` character and the matcher
 must be end of the string.
 
 
@@ -317,7 +317,7 @@ must be end of the string.
 
 ##  3. Shorthand Character Sets
 
-Regular expression provides shorthands for the commonly used character sets, which offer convenient shorthands for commonly used 
+Regular expression provides shorthands for the commonly used character sets, which offer convenient shorthands for commonly used
 regular expressions. The shorthand character sets are as follows:
 
 |Shorthand|Description|
@@ -332,10 +332,10 @@ regular expressions. The shorthand character sets are as follows:
 
 ## 4. Lookaround
 
-Lookbehind and lookahead sometimes known as lookaround are specific type of ***non-capturing group*** (Use to match the pattern but not 
-included in matching list). Lookaheads are used when we have the condition that this pattern is preceded or followed by another certain 
-pattern. For example, we want to get all numbers that are preceded by `$` character from the following input string `$4.44 and $10.88`. 
-We will use following regular expression `(?<=\$)[0-9\.]*` which means: get all the numbers which contain `.` character and  are preceded 
+Lookbehind and lookahead sometimes known as lookaround are specific type of ***non-capturing group*** (Use to match the pattern but not
+included in matching list). Lookaheads are used when we have the condition that this pattern is preceded or followed by another certain
+pattern. For example, we want to get all numbers that are preceded by `$` character from the following input string `$4.44 and $10.88`.
+We will use following regular expression `(?<=\$)[0-9\.]*` which means: get all the numbers which contain `.` character and  are preceded
 by `$` character. Following are the lookarounds that are used in regular expressions:
 
 |Symbol|Description|
@@ -348,11 +348,11 @@ by `$` character. Following are the lookarounds that are used in regular express
 ### 4.1 Positive Lookahead
 
 The positive lookahead asserts that the first part of the expression must be followed by the lookahead expression. The returned match
-only contains the text that is matched by the first part of the expression. To define a positive lookahead, parentheses are used. Within 
-those parentheses, a question mark with equal sign is used like this: `(?=...)`. Lookahead expression is written after the equal sign inside 
-parentheses. For example, the regular expression `[T|t]he(?=\sfat)` means: optionally match lowercase letter `t` or uppercase letter `T`, 
+only contains the text that is matched by the first part of the expression. To define a positive lookahead, parentheses are used. Within
+those parentheses, a question mark with equal sign is used like this: `(?=...)`. Lookahead expression is written after the equal sign inside
+parentheses. For example, the regular expression `[T|t]he(?=\sfat)` means: optionally match lowercase letter `t` or uppercase letter `T`,
 followed by letter `h`, followed by letter `e`. In parentheses we define positive lookahead which tells regular expression engine to match
-`The` or `the` which are followed by the word `fat`. 
+`The` or `the` which are followed by the word `fat`.
 
 
 "[T|t]he(?=\sfat)" => The fat cat sat on the mat.
@@ -362,9 +362,9 @@ followed by letter `h`, followed by letter `e`. In parentheses we define positiv
 
 ### 4.2 Negative Lookahead
 
-Negative lookahead is used when we need to get all matches from input string that are not followed by a pattern. Negative lookahead 
-defined same as we define positive lookahead but the only difference is instead of equal `=` character we use negation `!` character 
-i.e. `(?!...)`. Let's take a look at the following regular expression `[T|t]he(?!\sfat)` which means: get all `The` or `the` words from 
+Negative lookahead is used when we need to get all matches from input string that are not followed by a pattern. Negative lookahead
+defined same as we define positive lookahead but the only difference is instead of equal `=` character we use negation `!` character
+i.e. `(?!...)`. Let's take a look at the following regular expression `[T|t]he(?!\sfat)` which means: get all `The` or `the` words from
 input string that are not followed by the word `fat` precedes by a space character.
 
 
@@ -375,8 +375,8 @@ input string that are not followed by the word `fat` precedes by a space charact
 
 ### 4.3 Positive Lookbehind
 
-Positive lookbehind is used to get all the matches that are preceded by a specific pattern. Positive lookbehind is denoted by 
-`(?<=...)`. For example, the regular expression `(?<=[T|t]he\s)(fat|mat)` means: get all `fat` or `mat` words from input string that 
+Positive lookbehind is used to get all the matches that are preceded by a specific pattern. Positive lookbehind is denoted by
+`(?<=...)`. For example, the regular expression `(?<=[T|t]he\s)(fat|mat)` means: get all `fat` or `mat` words from input string that
 are after the word `The` or `the`.
 
 
@@ -387,8 +387,8 @@ are after the word `The` or `the`.
 
 ### 4.4 Negative Lookbehind
 
-Negative lookbehind is used to get all the matches that are not preceded by a specific pattern. Negative lookbehind is denoted by 
-`(?
@@ -399,7 +399,7 @@ are not after the word `The` or `the`.
 
 ## 5. Flags
 
-Flags are also called modifiers because they modify the output of a regular expression. These flags can be used in any order or 
+Flags are also called modifiers because they modify the output of a regular expression. These flags can be used in any order or
 combination, and are an integral part of the RegExp.
 
 |Flag|Description|
@@ -410,9 +410,9 @@ combination, and are an integral part of the RegExp.
 
 ### 5.1 Case Insensitive
 
-The `i` modifier is used to perform case-insensitive matching. For example, the regular expression `/The/gi` means: uppercase letter 
-`T`, followed by lowercase character `h`, followed by character `e`. And at the end of regular expression the `i` flag tells the 
-regular expression engine to ignore the case. As you can see we also provided `g` flag because we want to search for the pattern in 
+The `i` modifier is used to perform case-insensitive matching. For example, the regular expression `/The/gi` means: uppercase letter
+`T`, followed by lowercase character `h`, followed by character `e`. And at the end of regular expression the `i` flag tells the
+regular expression engine to ignore the case. As you can see we also provided `g` flag because we want to search for the pattern in
 the whole input string.
 
 
@@ -429,9 +429,9 @@ the whole input string.
 
 ### 5.2 Global search
 
-The `g` modifier is used to perform a global match (find all matches rather than stopping after the first match). For example, the 
-regular expression`/.(at)/g` means: any character except new line, followed by lowercase character `a`, followed by lowercase 
-character `t`. Because we provided `g` flag at the end of the regular expression now it will find every matches from whole input 
+The `g` modifier is used to perform a global match (find all matches rather than stopping after the first match). For example, the
+regular expression`/.(at)/g` means: any character except new line, followed by lowercase character `a`, followed by lowercase
+character `t`. Because we provided `g` flag at the end of the regular expression now it will find every matches from whole input
 string.
 
 
@@ -448,9 +448,9 @@ string.
 
 ### 5.3 Multiline
 
-The `m` modifier is used to perform a multi-line match. As we discussed earlier anchors `(^, $)` are used to check if pattern is 
+The `m` modifier is used to perform a multi-line match. As we discussed earlier anchors `(^, $)` are used to check if pattern is
 the beginning of the input or end of the input string. But if we want that anchors works on each line we use `m` flag. For example, the
-regular expression `/at(.)?$/gm` means: lowercase character `a`, followed by lowercase character `t`, optionally anything except new 
+regular expression `/at(.)?$/gm` means: lowercase character `a`, followed by lowercase character `t`, optionally anything except new
 line. And because of `m` flag now regular expression engine matches pattern at the end of each line in a string.
 
 
@@ -496,7 +496,7 @@ line. And because of `m` flag now regular expression engine matches pattern at t
 
 * Report issues
 * Open pull request with improvements
-* Spread the word 
+* Spread the word
 * Reach out to me directly at ziishaned@gmail.com or [![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/ziishaned.svg?style=social&label=Follow%20%40ziishaned)](https://twitter.com/ziishaned)
 
 ## License

From 4158a0385fd02413d1e1575e59e9bf3cea2f8ad6 Mon Sep 17 00:00:00 2001
From: Zeeshan Ahmed 
Date: Wed, 16 Aug 2017 08:26:23 +0500
Subject: [PATCH 03/36] Update translations in README.md

---
 README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/README.md b/README.md
index 6ea79f7..2046717 100644
--- a/README.md
+++ b/README.md
@@ -6,6 +6,7 @@
 ## Translations:
 
 * [English](README.md)
+* [Spanish](README-es.md) 
 * [中文版](README-cn.md)
 * [日本語](README-ja.md)
 

From 4ab2af3c4cb24ff10cc6d8271480dc6ff5756fa4 Mon Sep 17 00:00:00 2001
From: Zeeshan Ahmed 
Date: Wed, 16 Aug 2017 08:27:43 +0500
Subject: [PATCH 04/36] Update translations link

---
 README-cn.md | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/README-cn.md b/README-cn.md
index 84cc721..9769e30 100644
--- a/README-cn.md
+++ b/README-cn.md
@@ -6,7 +6,9 @@
 ## 翻译:
 
 * [English](README.md)
+* [Spanish](README-es.md) 
 * [中文版](README-cn.md)
+* [日本語](README-ja.md)
 
 ## 什么是正则表达式?
  

From fa9da320c9710337c40305ffa66bab9ca2e51b9e Mon Sep 17 00:00:00 2001
From: Zeeshan Ahmed 
Date: Wed, 16 Aug 2017 08:29:05 +0500
Subject: [PATCH 05/36] Update README.md

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 2046717..5cd8538 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
 ## Translations:
 
 * [English](README.md)
-* [Spanish](README-es.md) 
+* [Español](README-es.md) 
 * [中文版](README-cn.md)
 * [日本語](README-ja.md)
 

From 070093d1e6253b716461d1e744c39996118e03cc Mon Sep 17 00:00:00 2001
From: Zeeshan Ahmed 
Date: Wed, 16 Aug 2017 08:29:24 +0500
Subject: [PATCH 06/36] Update README-es.md

---
 README-es.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/README-es.md b/README-es.md
index 24e8643..42a10d2 100644
--- a/README-es.md
+++ b/README-es.md
@@ -6,8 +6,9 @@
 ## Translations:
 
 * [English](README.md)
+* [Español](README-es.md) 
 * [中文版](README-cn.md)
-* [Español](README-es.md)
+* [日本語](README-ja.md)
 
 ## What is Regular Expression?
 > 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.

From 8cb2f7d6cdf25bfec66e631c1fe8372ea66db3b7 Mon Sep 17 00:00:00 2001
From: Zeeshan Ahmed 
Date: Wed, 16 Aug 2017 08:29:42 +0500
Subject: [PATCH 07/36] Update README-ja.md

---
 README-ja.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/README-ja.md b/README-ja.md
index 991a46e..ba89c02 100644
--- a/README-ja.md
+++ b/README-ja.md
@@ -6,6 +6,7 @@
 ## 翻訳
 
 * [English](README.md)
+* [Español](README-es.md) 
 * [中文版](README-cn.md)
 * [日本語](README-ja.md)
 

From 94c90e66c35ad539e472e102dd313fbe612a4df7 Mon Sep 17 00:00:00 2001
From: Alex Sun 
Date: Wed, 16 Aug 2017 19:38:18 +0800
Subject: [PATCH 08/36] fix format (#55)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

replace `~` with `~` to avoid incorrect format
---
 README-cn.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README-cn.md b/README-cn.md
index 9769e30..34d42e0 100644
--- a/README-cn.md
+++ b/README-cn.md
@@ -206,7 +206,7 @@
 ## 2.4 `{}` 号
 
 在正则表达式中 `{}` 是一个量词, 常用来一个或一组字符可以重复出现的次数.
-例如,  表达式 `[0-9]{2,3}` 匹配 2~3 位 0~9 的数字.
+例如,  表达式 `[0-9]{2,3}` 匹配 2~3 位 0~9 的数字.
 
 
 

From 3cb7983839280fd3c1126d77b1b2adff9097f4d8 Mon Sep 17 00:00:00 2001
From: Abel 
Date: Wed, 16 Aug 2017 19:43:26 +0800
Subject: [PATCH 09/36] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E9=83=A8?=
 =?UTF-8?q?=E5=88=86=E8=AF=91=E6=96=87=20(#56)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* Update README-cn.md

* Update README-cn.md
---
 README-cn.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/README-cn.md b/README-cn.md
index 34d42e0..97725f6 100644
--- a/README-cn.md
+++ b/README-cn.md
@@ -16,8 +16,8 @@
 
 
 一个正则表达式是在一个主体字符串中从左到右匹配字符串时的一种样式.
-例如"Regular expression"是一个完整的句子, 但我们常使用缩写的术语"regex"或"regexp".
-正则表达式可以用来替换文本中的字符串,验证形式,提取字符串等等.
+"Regular expression"这个词比较拗口, 我们常使用缩写的术语"regex"或"regexp".
+正则表达式可以从一个基础字符串中根据一定的匹配模式替换文本中的字符串、验证表单、提取字符串等等.
 
 想象你正在写一个应用, 然后你想设定一个用户命名的规则, 让用户名包含字符,数字,下划线和连字符,以及限制字符的个数,好让名字看起来没那么丑.
 我们使用以下正则表达式来验证一个用户名:

From 499de93acd05e4f63a5d45d698595bd571ce799d Mon Sep 17 00:00:00 2001
From: AndyZ 
Date: Wed, 16 Aug 2017 19:51:08 +0800
Subject: [PATCH 10/36] Something really need to be clarified (#48)

* Something really need to be clarified

the `+` is tricky

* add explanation on the optional ?

Thanks for the great project , hope this can help to clarify a bit in Chinese

* Change a bit on .

some typo corrected
---
 README-cn.md | 2 +-
 README.md    | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/README-cn.md b/README-cn.md
index 97725f6..8306e36 100644
--- a/README-cn.md
+++ b/README-cn.md
@@ -261,7 +261,7 @@
 
 反斜线 `\` 在表达式中用于转码紧跟其后的字符. 用于指定 `{ } [ ] / \ + * . $ ^ | ?` 这些特殊字符. 如果想要匹配这些特殊字符则要在其前面加上反斜线 `\`.
 
-例如 `.` 是用来匹配除换行符外的所有字符的. 如果想要匹配句子中的 `.` 则要写成 `\.`.
+例如 `.` 是用来匹配除换行符外的所有字符的. 如果想要匹配句子中的 `.` 则要写成 `\.` 以下这个例子 `\.?`是选择性匹配`.`
 
 
 "(f|c|m)at\.?" => The fat cat sat on the mat.
diff --git a/README.md b/README.md
index 5cd8538..fa8e675 100644
--- a/README.md
+++ b/README.md
@@ -176,7 +176,7 @@ zero or more spaces.
 ### 2.3.2 The Plus
 
 The symbol `+` matches one or more repetitions of the preceding character. For example, the regular expression `c.+t` means: lowercase
-letter `c`, followed by at least one character, followed by the lowercase character `t`.
+letter `c`, followed by at least one character, followed by the lowercase character `t`. It needs to be clarified that `t` is the last `t` in the sentence.
 
 
 "c.+t" => The fat cat sat on the mat.

From 2375040f554549de998b9d22994ab11a44c46caa Mon Sep 17 00:00:00 2001
From: Zeeshan Ahmed 
Date: Wed, 16 Aug 2017 16:55:28 +0500
Subject: [PATCH 11/36] Update README.md

---
 README.md | 23 -----------------------
 1 file changed, 23 deletions(-)

diff --git a/README.md b/README.md
index fa8e675..31cd31c 100644
--- a/README.md
+++ b/README.md
@@ -470,29 +470,6 @@ line. And because of `m` flag now regular expression engine matches pattern at t
 
 [Test the regular expression](https://regex101.com/r/E88WE2/1)
 
-## Bonus
-
-* *Positive Integers*: `^\d+$`
-* *Negative Integers*: `^-\d+$`
-* *US Phone Number*: `^+?[\d\s]{3,}$`
-* *US Phone with code*: `^+?[\d\s]+(?[\d\s]{10,}$`
-* *Integers*: `^-?\d+$`
-* *Username*: `^[\w.]{4,16}$`
-* *Alpha-numeric characters*: `^[a-zA-Z0-9]*$`
-* *Alpha-numeric characters with spaces*: `^[a-zA-Z0-9 ]*$`
-* *Password*: `^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$`
-* *email*: `^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})*$`
-* *IPv4 address*: `^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*$`
-* *Lowercase letters only*: `^([a-z])*$`
-* *Uppercase letters only*: `^([A-Z])*$`
-* *URL*: `^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$`
-* *VISA credit card numbers*: `^(4[0-9]{12}(?:[0-9]{3})?)*$`
-* *Date (DD/MM/YYYY)*: `^(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}$`
-* *Date (MM/DD/YYYY)*: `^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$`
-* *Date (YYYY/MM/DD)*: `^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$`
-* *MasterCard credit card numbers*: `^(5[1-5][0-9]{14})*$`
-* *Hashtags*: Including hashtags with preceding text (abc123#xyz456) or containing white spaces within square brackets (#[foo bar]) : `\S*#(?:\[[^\]]+\]|\S+)`
-* *@mentions*: `\B@[a-z0-9_-]+`
 ## Contribution
 
 * Report issues

From b266e64b60c7709b5bef96abbb04c07f74478f33 Mon Sep 17 00:00:00 2001
From: Zeeshan Ahmed 
Date: Wed, 16 Aug 2017 16:56:06 +0500
Subject: [PATCH 12/36] Update README-ja.md

---
 README-ja.md | 24 ------------------------
 1 file changed, 24 deletions(-)

diff --git a/README-ja.md b/README-ja.md
index ba89c02..fe039ea 100644
--- a/README-ja.md
+++ b/README-ja.md
@@ -503,30 +503,6 @@
 
 [正規表現の動作確認をする](https://regex101.com/r/E88WE2/1)
 
-## おまけ
-
-* *正の整数*: `^\d+$`
-* *負の整数*: `^-\d+$`
-* *米国の電話番号*: `^+?[\d\s]{3,}$`
-* *コード付きの米国の電話番号*: `^+?[\d\s]+(?[\d\s]{10,}$`
-* *整数*: `^-?\d+$`
-* *ユーザ名*: `^[\w.]{4,16}$`
-* *英数字*: `^[a-zA-Z0-9]*$`
-* *スペース込みの英数字*: `^[a-zA-Z0-9 ]*$`
-* *パスワード*: `^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$`
-* *Eメール*: `^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})*$`
-* *IPv4 アドレス*: `^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*$`
-* *小文字のみ*: `^([a-z])*$`
-* *大文字のみ*: `^([A-Z])*$`
-* *URL*: `^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$`
-* *VISA クレジットカード番号*: `^(4[0-9]{12}(?:[0-9]{3})?)*$`
-* *日付 (DD/MM/YYYY)*: `^(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}$`
-* *日付 (MM/DD/YYYY)*: `^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$`
-* *日付 (YYYY/MM/DD)*: `^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$`
-* *MasterCard クレジットカード番号*: `^(5[1-5][0-9]{14})*$`
-* *ハッシュタグ*: 前の文字列を含む (abc123#xyz456) または角括弧内にスペースを含む (#[foo bar]) : `\S*#(?:\[[^\]]+\]|\S+)`
-* *@mentions*: `\B@[a-z0-9_-]+`
-
 ## 貢献する
 
 * 課題を発行する

From fc0548d940e6512dffb39166939fd14a643065a6 Mon Sep 17 00:00:00 2001
From: Zeeshan Ahmed 
Date: Wed, 16 Aug 2017 16:57:07 +0500
Subject: [PATCH 13/36] Update README-es.md

---
 README-es.md | 23 -----------------------
 1 file changed, 23 deletions(-)

diff --git a/README-es.md b/README-es.md
index 42a10d2..64ca596 100644
--- a/README-es.md
+++ b/README-es.md
@@ -449,29 +449,6 @@ el motor de expresión regular coincide con el patrón al final de cada línea d
 
 [Prueba la expresión regular](https://regex101.com/r/E88WE2/1)
 
-## Bonus
-
-* *Positive Integers*: `^\d+$`
-* *Negative Integers*: `^-\d+$`
-* *US Phone Number*: `^+?[\d\s]{3,}$`
-* *US Phone with code*: `^+?[\d\s]+(?[\d\s]{10,}$`
-* *Integers*: `^-?\d+$`
-* *Username*: `^[\w.]{4,16}$`
-* *Alpha-numeric characters*: `^[a-zA-Z0-9]*$`
-* *Alpha-numeric characters with spaces*: `^[a-zA-Z0-9 ]*$`
-* *Password*: `^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$`
-* *email*: `^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})*$`
-* *IPv4 address*: `^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*$`
-* *Lowercase letters only*: `^([a-z])*$`
-* *Uppercase letters only*: `^([A-Z])*$`
-* *URL*: `^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$`
-* *VISA credit card numbers*: `^(4[0-9]{12}(?:[0-9]{3})?)*$`
-* *Date (DD/MM/YYYY)*: `^(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}$`
-* *Date (MM/DD/YYYY)*: `^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$`
-* *Date (YYYY/MM/DD)*: `^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$`
-* *MasterCard credit card numbers*: `^(5[1-5][0-9]{14})*$`
-* *Hashtags*: Including hashtags with preceding text (abc123#xyz456) or containing white spaces within square brackets (#[foo bar]) : `\S*#(?:\[[^\]]+\]|\S+)`
-* *@mentions*: `\B@[a-z0-9_-]+`
 ## Contribution
 
 * Report issues

From 9368d09838e4e39a350b48505cb0b8fb331503e2 Mon Sep 17 00:00:00 2001
From: Zeeshan Ahmed 
Date: Wed, 16 Aug 2017 16:57:45 +0500
Subject: [PATCH 14/36] Update README-cn.md

---
 README-cn.md | 21 ---------------------
 1 file changed, 21 deletions(-)

diff --git a/README-cn.md b/README-cn.md
index 8306e36..e075d23 100644
--- a/README-cn.md
+++ b/README-cn.md
@@ -462,27 +462,6 @@
 
 [在线练习](https://regex101.com/r/E88WE2/1)
 
-## 额外补充
-
-* *正整数*: `^\d+$`
-* *负整数*: `^-\d+$`
-* *手机国家号*: `^+?[\d\s]{3,}$`
-* *手机号*: `^+?[\d\s]+(?[\d\s]{10,}$`
-* *整数*: `^-?\d+$`
-* *用户名*: `^[\w\d_.]{4,16}$`
-* *数字和英文字母*: `^[a-zA-Z0-9]*$`
-* *数字和英文字母和空格*: `^[a-zA-Z0-9 ]*$`
-* *密码*: `^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$`
-* *邮箱*: `^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})*$`
-* *IP4 地址*: `^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*$`
-* *纯小写字母*: `^([a-z])*$`
-* *纯大写字母*: `^([A-Z])*$`
-* *URL*: `^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$`
-* *VISA 信用卡号*: `^(4[0-9]{12}(?:[0-9]{3})?)*$`
-* *日期 (MM/DD/YYYY)*: `^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$`
-* *日期 (YYYY/MM/DD)*: `^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$`
-* *MasterCard 信用卡号*: `^(5[1-5][0-9]{14})*$`
-
 ## 贡献
 
 * 报告问题

From ea270ac1e399fc50b1905adf359a577bbbc2e2cf Mon Sep 17 00:00:00 2001
From: chroju 
Date: Thu, 17 Aug 2017 01:09:39 +0900
Subject: [PATCH 15/36] Fix typos (#57)

---
 README-ja.md | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/README-ja.md b/README-ja.md
index fe039ea..523928e 100644
--- a/README-ja.md
+++ b/README-ja.md
@@ -189,7 +189,7 @@
 
 シンボル `+` は直前の文字が 1 個以上続くパターンにマッチします。
 例えば `c.+t` という正規表現は小文字の `c` の後に
-任意の 1 文字が続き、さらに `t` が続くことを意味します。
+任意の 1 文字以上が続き、さらに `t` が続くことを意味します。
 
 
 "c.+t" => The fat cat sat on the mat.
@@ -342,7 +342,7 @@
 
 正規表現ではよく使われる文字集合に対して短縮表記が提供されており、
 便利なショートカットとして使用できます。
-省略表記には次のようなものがあります。
+短縮表記には次のようなものがあります。
 
 |短縮表記|説明                               |
 |:------:|-----------------------------------|
@@ -441,7 +441,7 @@
 
 ### 5.1 大文字・小文字を区別しない
 
-修飾子 `i` は大文字・小文字を区別しなくないときに使用します。
+修飾子 `i` は大文字・小文字を区別したくないときに使用します。
 例えば `/The/gi` という正規表現は大文字の `T` の後に小文字の `h`, `e` が続くという意味ですが、
 最後の `i` で大文字・小文字を区別しない設定にしています。
 文字列内の全マッチ列を検索したいのでフラグ `g` も渡しています。
@@ -505,7 +505,7 @@
 
 ## 貢献する
 
-* 課題を発行する
+* イシューを発行する
 * 修正をプルリクエストする
 * ドキュメントを普及させる
 * 作者に直接連絡を取る: ziishaned@gmail.com または [![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/ziishaned.svg?style=social&label=Follow%20%40ziishaned)](https://twitter.com/ziishaned)

From e698d5da285e08426f01d1bf49b627b3ef1403f8 Mon Sep 17 00:00:00 2001
From: Mayur 
Date: Thu, 17 Aug 2017 15:58:54 +0530
Subject: [PATCH 16/36] FIX typo in Escaping special character section (#63)

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 31cd31c..3fde940 100644
--- a/README.md
+++ b/README.md
@@ -259,7 +259,7 @@ or lowercase character `c`, followed by lowercase character `a`, followed by low
 
 ## 2.7 Escaping special character
 
-Backslash `\` is used in regular expression to escape the next character. This allows to to specify a symbol as a matching character 
+Backslash `\` is used in regular expression to escape the next character. This allows us to specify a symbol as a matching character 
 including reserved characters `{ } [ ] / \ + * . $ ^ | ?`. To use a special character as a matching character prepend `\` before it. 
 For example, the regular expression `.` is used to match any character except newline. Now to match `.` in an input string the regular
 expression `(f|c|m)at\.?` means: lowercase letter `f`, `c` or `m`, followed by lowercase character `a`, followed by lowercase letter 

From 9483a3fa16268b43979e5428db5b80a6663be09f Mon Sep 17 00:00:00 2001
From: Sahib Yar 
Date: Thu, 17 Aug 2017 15:29:42 +0500
Subject: [PATCH 17/36] deleted the bonus from table of contents (#62)

As you now you have removed the bonus section, which contained the examples, the bonus tag should be removed from the table of contents also.
---
 README.md | 1 -
 1 file changed, 1 deletion(-)

diff --git a/README.md b/README.md
index 3fde940..ece50f7 100644
--- a/README.md
+++ b/README.md
@@ -57,7 +57,6 @@ contains uppercase letter and also it is too short.
   - [Case Insensitive](#51-case-insensitive)
   - [Global search](#52-global-search)
   - [Multiline](#53-multiline)
-- [Bonus](#bonus)
 
 ## 1. Basic Matchers
 

From 7ddb3f6bf5556aa62d67ab6fee8fb4091ee5a9ab Mon Sep 17 00:00:00 2001
From: Allan 
Date: Fri, 18 Aug 2017 10:11:36 +0800
Subject: [PATCH 18/36] Add some compatible character set (#64)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

修改一处错别字
添加部分简写字符集
---
 README-cn.md | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/README-cn.md b/README-cn.md
index e075d23..2fbcee5 100644
--- a/README-cn.md
+++ b/README-cn.md
@@ -277,7 +277,7 @@
 
 `^` 用来检查匹配的字符串是否在所匹配字符串的开头.
 
-例如, 在 `abc` 中使用表达式 `^a` 会得到结果 `a`. 但如果使用 `^b` 将匹配不到任何结果. 应为在字符串 `abc` 中并不是以 `b` 开头.
+例如, 在 `abc` 中使用表达式 `^a` 会得到结果 `a`. 但如果使用 `^b` 将匹配不到任何结果. 因为在字符串 `abc` 中并不是以 `b` 开头.
 
 例如, `^(T|t)he` 匹配以 `The` 或 `the` 开头的字符串.
 
@@ -324,6 +324,12 @@
 |\D|匹配非数字: `[^\d]`|
 |\s|匹配所有空格字符, 等同于: `[\t\n\f\r\p{Z}]`|
 |\S|匹配所有非空格字符: `[^\s]`|
+|\f|匹配一个换页符|
+|\n|匹配一个换行符|
+|\r|匹配一个回车符|
+|\t|匹配一个制表符|
+|\v|匹配一个垂直制表符|
+|\p|匹配 CR/LF (等同于 `\r\n`),用来匹配 DOS 行终止符|
 
 ## 4. 前后关联约束(前后预查)
 

From e67ac5d408e36e8403b3682548a0c41e3e39bec9 Mon Sep 17 00:00:00 2001
From: Loic Humbert 
Date: Fri, 18 Aug 2017 18:16:07 +0200
Subject: [PATCH 19/36] French translation (#59)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* created file for translation

* Added french link

* Intro translated

* Intro translated

* §1

* §2

* Titles translated

* §2.1

* Fixed tick issue in title star

* Fixed tick issue in title star

* §2.2

* Fixed multilignes link

* Organized language choice

* §2.2.1

* 2.3 => 2.3.1

* §2.3.2

* §2.3.3

* §2.7

* 2.4 => 2.7

* 2.8.1

* 2.8.2 => 4

* 4.2 => 4.3

* 4.4

* changed 'Recherche globale' to 'Correspondance globale'

* 5.1

* 5

* 5.1

* 5.3

* FINISHED git commit -am 5.3git commit -am 5.3git commit -am 5.3 FUCK YEAH git commit -am 5.3git commit -am 5.3git commit -am 5.3! :DDD

* corrected typos

* changed modèle for schéma

* corrected typo

* corrected typo

* corrected typo

* corrected typo

* corrected typo

* corrected typo

* corrected typo

* corrected typo

* corrected typo

* corrected typo
---
 README-cn.md |  21 +--
 README-es.md |   3 +-
 README-fr.md | 468 +++++++++++++++++++++++++++++++++++++++++++++++++++
 README-ja.md |   3 +-
 README.md    |   4 +-
 5 files changed, 486 insertions(+), 13 deletions(-)
 create mode 100644 README-fr.md

diff --git a/README-cn.md b/README-cn.md
index 2fbcee5..57b0b34 100644
--- a/README-cn.md
+++ b/README-cn.md
@@ -6,12 +6,13 @@
 ## 翻译:
 
 * [English](README.md)
-* [Spanish](README-es.md) 
+* [Español](README-es.md)
+* [Français](README-fr.md)
 * [中文版](README-cn.md)
 * [日本語](README-ja.md)
 
 ## 什么是正则表达式?
- 
+
 > 正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找出满足你想要的格式的句子.
 
 
@@ -69,7 +70,7 @@
 例如: 一个正则表达式 `the`, 它表示一个规则: 由字母`t`开始,接着是`h`,再接着是`e`.
 
 
-"the" => The fat cat sat on the mat. 
+"the" => The fat cat sat on the mat.
 
[在线练习](https://regex101.com/r/dmRygT/1) @@ -106,7 +107,7 @@ ## 2.1 点运算符 `.` -`.`是元字符中最简单的例子. +`.`是元字符中最简单的例子. `.`匹配任意单个字符, 但不匹配换行符. 例如, 表达式`.ar`匹配一个任意字符后面跟着是`a`和`r`的字符串. @@ -152,7 +153,7 @@ ## 2.3 重复次数 -后面跟着元字符 `+`, `*` or `?` 的, 用来指定匹配子模式的次数. +后面跟着元字符 `+`, `*` or `?` 的, 用来指定匹配子模式的次数. 这些元字符在不同的情况下有着不同的意思. ### 2.3.1 `*` 号 @@ -218,7 +219,7 @@ 我们可以省略第二个参数. 例如, `[0-9]{2,}` 匹配至少两位 0~9 的数字. -如果逗号也省略掉则表示重复固定的次数. +如果逗号也省略掉则表示重复固定的次数. 例如, `[0-9]{3}` 匹配3位数字
@@ -353,7 +354,7 @@
 `?=...` 前置约束(存在), 表示第一部分表达式必须跟在 `?=...`定义的表达式之后.
 
 返回结果只瞒住第一部分表达式.
-定义一个前置约束(存在)要使用 `()`. 在括号内部使用一个问号和等号: `(?=...)`. 
+定义一个前置约束(存在)要使用 `()`. 在括号内部使用一个问号和等号: `(?=...)`.
 
 前置约束的内容写在括号中的等号后面.
 例如, 表达式 `[T|t]he(?=\sfat)` 匹配 `The` 和 `the`, 在括号中我们又定义了前置约束(存在) `(?=\sfat)` ,即 `The` 和 `the` 后面紧跟着 `(空格)fat`.
@@ -367,7 +368,7 @@
 ### 4.2 `?!...` 前置约束-排除
 
 前置约束-排除 `?!` 用于筛选所有匹配结果, 筛选条件为 其后不跟随着定义的格式
-`前置约束-排除`  定义和 `前置约束(存在)` 一样, 区别就是 `=` 替换成 `!` 也就是 `(?!...)`. 
+`前置约束-排除`  定义和 `前置约束(存在)` 一样, 区别就是 `=` 替换成 `!` 也就是 `(?!...)`.
 
 表达式 `[T|t]he(?!\sfat)` 匹配 `The` 和 `the`, 且其后不跟着 `(空格)fat`.
 
@@ -429,7 +430,7 @@
 
 ### 5.2 全局搜索 (Global search)
 
-修饰符 `g` 常用语执行一个全局搜索匹配, 即(不仅仅返回第一个匹配的, 而是返回全部). 
+修饰符 `g` 常用语执行一个全局搜索匹配, 即(不仅仅返回第一个匹配的, 而是返回全部).
 例如, 表达式 `/.(at)/g` 表示搜索 任意字符(除了换行) + `at`, 并返回全部结果.
 
 
@@ -446,7 +447,7 @@
 
 ### 5.3 多行修饰符 (Multiline)
 
-多行修饰符 `m` 常用语执行一个多行匹配. 
+多行修饰符 `m` 常用语执行一个多行匹配.
 
 像之前介绍的 `(^,$)` 用于检查格式是否是在待检测字符串的开头或结尾. 但我们如果想要它在每行的开头和结尾生效, 我们需要用到多行修饰符 `m`.
 
diff --git a/README-es.md b/README-es.md
index 64ca596..6988406 100644
--- a/README-es.md
+++ b/README-es.md
@@ -6,7 +6,8 @@
 ## Translations:
 
 * [English](README.md)
-* [Español](README-es.md) 
+* [Español](README-es.md)
+* [Français](README-fr.md)
 * [中文版](README-cn.md)
 * [日本語](README-ja.md)
 
diff --git a/README-fr.md b/README-fr.md
new file mode 100644
index 0000000..931abd1
--- /dev/null
+++ b/README-fr.md
@@ -0,0 +1,468 @@
+
+

+Learn Regex +


+ +## Traductions: + +* [English](README.md) +* [Español](README-es.md) +* [Français](README-fr.md) +* [中文版](README-cn.md) +* [日本語](README-ja.md) + +## Qu'est-ce qu'une expression régulière? + +> Une expression régulière est un groupement de caractères ou symboles utilisés pour trouver un schéma spécifique dans un texte. + +Une expression régulière est un schéma qui est comparée à une chaîne de caractères de gauche à droite. Le mot "Expression régulière" +est un terme entier, souvent abrégé par "regex" ou "regexp". Une expression régulière est utilisée pour remplacer un texte à l'intérieur +d'une *string* (une chaîne de caractères), valider un formulaire, extraire une portion de string basée sur un schéma, et bien plus encore. + +Imaginons que nous écrivons une application et que nous voulons définir des règles pour le choix d'un pseudonyme. Nous voulons autoriser +le pseudonyme à contenir des lettres, des nombres, des underscores et des traits d'union. Nous voulons aussi limiter le nombre +de caractères dans le pseudonyme pour qu'il n'ait pas l'air moche. Nous utilisons l'expression régulière suivante pour valider un pseudonyme: +

+

+Regular expression +

+ +L'expression régulière ci-dessus peut accepter les strings `john_doe`, `jo-hn_doe` et `john12_as`. Ça ne fonctionne pas avec `Jo` car +cette string contient une lettre majuscule et elle est trop courte. + +## Table des matières + +- [Introduction](#1-introduction) +- [Meta-caractères](#2-meta-caractères) + - [Full stop](#21-full-stop) + - [Inclusion de caractères](#22-inclusion-de-caractères) + - [Exclusion de caractères](#221-exclusion-de-caractères) + - [Répétitions](#23-répétitions) + - [Astérisque](#231-Asterisque) + - [Le Plus](#232-le-plus) + - [Le Point d'Interrogation](#233-le-point-d'interrogation) + - [Accolades](#24-accolades) + - [Groupement de caractères](#25-groupement-de-caractères) + - [Alternation](#26-alternation) + - [Caractère d'échappement](#27-caractère-d'échappement) + - [Ancres](#28-ancres) + - [Circonflexe](#281-circonflexe) + - [Dollar](#282-dollar) +- [Liste de caractères abrégés](#3-liste-de-caractères-abrégés) +- [Recherche](#4-recherche) + - [Recherche avant positive](#41-recherche-avant-positive) + - [Recherche avant négative](#42-recherche-avant-négative) + - [Recherche arrière positive](#43-recherche-arrière-positive) + - [Recherche arrière négative](#44-recherche-arrière-négative) +- [Drapeaux](#5-drapeaux) + - [Insensible à la casse](#51-insensible-à-la-casse) + - [Correspondance globale](#52-recherche-globale) + - [Multilignes](#53-multilignes) + +## 1. Introduction + +Une expression régulière est un schéma de caractères utilisés pour effectuer une recherche dans un text. +Par exemple, l'expression régulière `the` signifie: la lettre `t`, suivie de la lettre `h`, suivie de la lettre `e`. + +
+"the" => The fat cat sat on the mat.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/dmRygT/1) + +L'expression régulière `123` coïncide à la chaîne `123`. Chaque caractère de l'expression régulière est comparée à la chaine passée en entrée, caractère par caractère. Les expressions régulières sont normalement sensibles à la casse, donc l'expression régulière `The` ne va pas coïncider à la chaine de caractère `the`. + +
+"The" => The fat cat sat on the mat.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/1paXsy/1) + +## 2. Meta-caractères + +Les meta-caractères sont les bloques de construction des expressions régulières. Les meta-caractères sont interprétés de manière particulière. Certains meta-caractères ont des significations spéciales et sont écrits entre crochets. +Significations des meta-caractères: + +|Meta-caractère|Description| +|:----:|----| +|.|Un point coïncide avec n'importe quel caractère unique à part le retour à la ligne.| +|[ ]|Classe de caractères. Coïncide avec n'importe quels caractères entre crochets.| +|[^ ]|Négation de classe de caractère. Coïncide avec n'importe quels caractères qui n'est pas entre les crochets.| +|*|Coïncide avec 0 ou plus répétitions du caractère précédent.| +|+|Coïncide avec 1 ou plus répétitions du caractère précédent.| +|?|Rend le caractère précédent optionnel.| +|{n,m}|Accolades. Coïncide avec au moins "n" mais pas plus que "m" répétition(s) du caractère précédent.| +|(xyz)|Groupe de caractères. Coïncide avec les caractères "xyz" dans l'ordre exact.| +|||Alternation (ou). Coïncide soit avec le caractère avant ou après le symbol.| +|\|Échappe le prochain caractère. Cela permet de faire coïncider des caractères réservés tels que [ ] ( ) { } . * + ? ^ $ \ || +|^|Coïncide avec le début de la chaîne de caractères.| +|$|Coïncide avec la fin de la chaîne de caractères.| + +## 2.1 Full stop + +Le full stop `.` est l'exemple le plus simple d'un meta-caratère. Le `.` coïncide avec n'importe quel caractère unique, mais ne coïncide pas avec les caractères de retour ou de nouvelle ligne. Par exemple, l'expression régulière `.ar` signifie: n'importe quel caractère suivi par la lettre `a`, suivie par la lettre `r`. + +
+".ar" => The car parked in the garage.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/xc9GkU/1) + +## 2.2 Inclusions de caractères + +Les inclusions de caractères sont également appelées classes de caractères. Les crochets sont utilisés pour spécifier les inclusions de caractères. Un trait d'union utilisé dans une inclusion de caractères permet de définir une gamme de caractères. L'ordre utilisé dans la gamme de caractère n'a pas d'importance. Par exemple, l'expression régulière `[Tt]he` signifie: un `T` majuscule ou `t` minucule, suivi par la lettre `h`, suivie par la lettre `e`. + +
+"[Tt]he" => The car parked in the garage.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/2ITLQ4/1) + +L'utilisation du point dans une inclusion de caractère signifie toutefois un `.` littéral. L'expression régulière `ar[.]` signifie: un `a` minuscule, suivi par la lettre `r` minuscule, suvie par un `.` (point). + +
+"ar[.]" => A garage is a good place to park a car.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/wL3xtE/1) + +### 2.2.1 Exclusion de caractères + +En règle générale, le caractère circonflexe représente le début d'une chaîne de caractères. Néanmoins, lorsqu'il est utilisé après le crochet ouvrant, il permet d'exclure la gamme de caractère(s). Par exemple, l'expression régulière `[^c]ar` signifie: n'importe quel caractère sauf `c`, suivi par la lettre `a`, suivie par la lettre `r`. + +
+"[^c]ar" => The car parked in the garage.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/nNNlq3/1) + +## 2.3 Répétitions + +Les meta-caractères suivants `+`, `*` ou `?` sont utilisés pour spécifier combien de fois un sous-schéma peut apparaître. Ces meta-caractères agissent +différemment selon la situation dans laquelle ils sont utilisés. + +### 2.3.1 Astérisque + +Le symbole `*` correspond à zéro ou plus de répétitions du schéma précédent. L'expression régulière `a*` signifie: zéro ou plus de répétitions +du précédent `a` minuscule. Mais si il se trouve après une liste de caractères alors il s'agit de la répétition de la liste entière. +Par exemple, l'expression régulière `[a-z]*` signifie: n'importe combien de lettres minuscules. + +
+"[a-z]*" => The car parked in the garage #21.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/7m8me5/1) + +Le symbole `*` peut être utilisé avec le meta-caractère `.` pour correspondre à n'importe quelle chaîne de caractères `.*`. Le symbole `*` peut être utilisé avec le +caractère espace vide `\s` pour correspondre à une chaîne d'espaces vides. Par exemple, l'expression `\s*cat\s*` signifie: zéro ou plus +d'espaces, suivis du caractère `c` minuscule, suivi par le caractère `a` minuscule, suivi par le caractère `t` minuscule, suivi par +zéro ou plus d'espaces. + +
+"\s*cat\s*" => The fat cat sat on the concatenation.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/gGrwuz/1) + +### 2.3.2 Le Plus + +Le meta-caractère `+` correspond à une ou plusieurs répétitions du caractère précédent. Par exemple, l'expression régulière `c.+t` signifie: la lettre `c` minuscule, suivie par au moins un caractère, suivi par la lettre `t` minuscule. Le `t` coïncide par conséquent avec le dernier `t` de la phrase. + +
+"c.+t" => The fat cat sat on the mat.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/Dzf9Aa/1) + +### 2.3.3 Le point d'interrogation + +Le meta-caractère `?` rend le caractère précédent optionel. Ce symbole permet de faire coïncider 0 ou une instance du caractère précédent. Par exemple, l'expression régulière `[T]?he` signifie: la lettre `T` majuscule optionelle, suivie par la lettre `h` minuscule, suivie par la lettre `e` minuscule. + +
+"[T]he" => The car is parked in the garage.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/cIg9zm/1) + +
+"[T]?he" => The car is parked in the garage.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/kPpO2x/1) + +## 2.4 Accolades + +Dans une expression régulière, les accolades, qui sont aussi appelée quantifieurs, sont utilisées pour spécifier le nombre de fois qu'un +caractère ou un groupe de caractères peut être répété. Par exemple, l'expression régulière `[0-9]{2,3}` signifie: Trouve au moins 2 chiffres mais pas plus de 3 +(caractères dans la gamme de 0 à 9). + +
+"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/juM86s/1) + +Nous pouvons omettre le second nombre. Par exemple, l'expression régulière `[0-9]{2,}` signifie: Trouve 2 chiffres ou plus. Si nous supprimons aussi +la virgule l'expression régulière `[0-9]{3}` signifie: Trouve exactement 3 chiffres. + +
+"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/Gdy4w5/1) + +
+"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/Sivu30/1) + +## 2.5 Groupement de caractères + +Un groupement de caractères est un groupe de sous-schémas qui sont écris dans des parenthèses `(...)`. Nous avions mentionné plus tôt que, dans une expression régulière, +si nous mettons un quantifieur après un caractère alors le caractère précédent sera répété. Mais si nous mettons un quantifieur après un groupement de caractères alors +il répète le groupement de caractères entier. Par exemple, l'expression régulière `(ab)*` trouve zéro ou plus de répétitions des caractères "ab". +Nous pouvons aussi utiliser le meta-caractère d'alternation `|` à l'intérieur d'un groupement. Par exemple, l'expression régulière `(c|g|p)ar` signifie: caractère `c` minuscule, +`g` ou `p`, suivi par le caractère `a`, suivi par le caractère `r`. + +
+"(c|g|p)ar" => The car is parked in the garage.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/tUxrBG/1) + +## 2.6 Alternation + +Dans une expression régulière, la barre verticale `|` est utilisée pour définir une alternation. L'alternation est comme une condition entre plusieurs expressions. Maintenant, +nous pourrions penser que la liste de caractères et l'alternation sont la même chose. Mais la grande différence entre une liste de caractères et l'alternation +est que la liste de caractères fonctionne au niveau des caractères mais l'alternation fonctionne au niveau de l'expression. Par exemple, l'expression régulière +`(T|t)he|car` signifie: le caractère `T` majuscule ou `t` minuscule, suivi par le caractère `h` minuscule, suivi par le caractère `e` minuscule +ou le caractère `c` minuscule, suivi par le caractère `a` minuscule, suivit par le caractère `r` minuscule. + +
+"(T|t)he|car" => The car is parked in the garage.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/fBXyX0/1) + +## 2.7 Caractère d'échappement + +L'antislash `\` est utilisé dans les expressions régulières pour échapper (ignorer) le caractère suivant. Cela permet de spécifier un symbole comme caractère à trouver +y compris les caractères réservés `{ } [ ] / \ + * . $ ^ | ?`. Pour utiliser un caractère spécial comme caractère à trouver, préfixer `\` avant celui-ci. +Par exemple, l'expression régulière `.` est utilisée pour trouver n'importe quel caractère sauf le retour de ligne. Donc pour trouver `.` dans une string +l'expression régulière `(f|c|m)at\.?` signifie: la lettre minuscule `f`, `c` ou `m`, suivie par le caractère `a` minuscule, suivi par la lettre +`t` minuscule, suivie par le caractère optionnel `.`. + +
+"(f|c|m)at\.?" => The fat cat sat on the mat.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/DOc5Nu/1) + +## 2.8 Ancres + +Dans les expressions régulières, nous utilisons des ancres pour vérifier si le symbole trouvé est le premier ou dernier symbole de la +string. Il y a 2 types d'ancres: Le premier type est le circonflexe `^` qui cherche si le caractère est le premier +caractère de la string et le deuxième type est le Dollar `$` qui vérifie si le caractère est le dernier caractère de la string. + +### 2.8.1 Circonflexe + +Le symbole circonflexe `^` est utilisé pour vérifier si un caractère est le premier caractère de la string. Si nous appliquons l'expression régulière +suivante `^a` (si a est le premier symbole) à la string `abc`, ça coïncide. Mais si nous appliquons l'expression régulière `^b` sur cette même string, +ça ne coïncide pas. Parce que dans la string `abc` "b" n'est pas le premier symbole. Regardons une autre expression régulière +`^(T|t)he` qui signifie: le caractère `T` majuscule ou le caractère `t` minuscule est le premier symbole de la string, +suivi par le caractère `h` minuscule, suivi par le caractère `e` minuscule. + +
+"(T|t)he" => The car is parked in the garage.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/5ljjgB/1) + +
+"^(T|t)he" => The car is parked in the garage.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/jXrKne/1) + +### 2.8.2 Dollar + +Le symbole Dollar `$` est utilisé pour vérifier si un caractère est le dernier caractère d'une string. Par exemple, l'expression régulière +`(at\.)$` signifie: un caractère `a` minuscule, suivi par un caractère `t` minuscule, suivi par un caractère `.` et tout cela doit être +à la fin de la string. + +
+"(at\.)" => The fat cat. sat. on the mat.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/y4Au4D/1) + +
+"(at\.)$" => The fat cat. sat. on the mat.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/t0AkOd/1) + +## 3. Liste de caractères abrégés + +Les expressions régulières fournissent des abréviations pour les listes de caractères, ce qui offres des raccourcis pratiques pour +les expressions régulières souvent utilisées. Ces abréviations sont les suivantes: + +|Abréviation|Description| +|:----:|----| +|.|N'importe quel caractère à part le retour de ligne| +|\w|Caractères alphanumériques: `[a-zA-Z0-9_]`| +|\W|Caractères non-alphanumériques: `[^\w]`| +|\d|Chiffres: `[0-9]`| +|\D|Non-numériques: `[^\d]`| +|\s|Espace vide: `[\t\n\f\r\p{Z}]`| +|\S|Tout sauf espace vide: `[^\s]`| + +## 4. Recherche + +La recherche en avant et en arrière sont un type spécifique appelé ***groupe non-capturant*** (utilisés pour trouver un schéma mais pas +pour l'inclure dans la liste de correspondance). Les recherches positives sont utilisées quand nous avons la condition qu'un schéma doit être précédé ou suivi +par un autre schéma. Par exemple, nous voulons tous les chiffres qui sont précédés par le caractère `$` dans la string suivante `$4.44 and $10.88`. +Nous allons utiliser l'expression régulière suivante `(?<=\$)[0-9\.]*` qui signifie: Trouver tous les nombres qui contiennent le caractère `.` et sont précédés +par le caractère `$`. Les recherches que nous trouvons dans les expressions régulières sont les suivantes: + +|Symbole|Description| +|:----:|----| +|?=|Recherche en avant positive| +|?!|Recherche en avant négative| +|?<=|Recherche en arrière positive| +|? +"[T|t]he(?=\sfat)" => The fat cat sat on the mat. +
+ +[Essayer l'expression régulière](https://regex101.com/r/IDDARt/1) + +### 4.2 Recherche en avant négative + +La recherche en avant négative est utilisée quand nous avons besoin de trouver une string qui n'est pas suivie d'un schéma. La recherche en avant négative +est définie de la même manière que la recherche en avant positive mais la seule différence est qu'à la place du signe égual `=` nous utilisons le caractère de négation `!` +i.e. `(?!...)`. Regardons l'expression régulière suivante `[T|t]he(?!\sfat)` qui signifie: trouve tous les mots `The` ou `the` de la string +qui ne sont pas suivis du mot `fat` précédé d'un espace. + +
+"[T|t]he(?!\sfat)" => The fat cat sat on the mat.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/V32Npg/1) + +### 4.3 Recherche en arrière positive + +La recherche en arrière positive est utilisée pour trouver une string précédée d'un schéma. La recherche en arrière positive se note +`(?<=...)`. Par exemple, l'expression régulière `(?<=[T|t]he\s)(fat|mat)` signifie: trouve tous les mots `fat` ou `mat` de la string qui +se trouve après le mot `The` ou `the`. + +
+"(?<=[T|t]he\s)(fat|mat)" => The fat cat sat on the mat.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/avH165/1) + +### 4.4 Recherche en arrière négative + +La recherche en arrière négative est utilisée pour trouver une string qui n'est pas précédée d'un schéma. La recherche en arrière négative se note +`(? +"(?<![T|t]he\s)(cat)" => The cat sat on cat. +
+ +[Essayer l'expression régulière](https://regex101.com/r/8Efx5G/1) + +## 5. Drapeaux + +Les drapeaux sont aussi appelés modifieurs car ils modifient la sortie d'une expression régulière. Ces drapeaux peuvent être utilisés +dans n'importe quel ordre et combinaison et font partie intégrante de la RegExp. + +|Drapeau|Description| +|:----:|----| +|i|Insensible à la casse: Définit que la correspondance sera insensible à la casse.| +|g|Recherche globale: Recherche la correspondance dans la string entière.| +|m|Multiligne: Meta-caractère ancre qui agit sur toutes les lignes.| + +### 5.1 Insensible à la casse + +Le modifieur `i` est utilisé pour faire une correspondance insensible à la casse. Par exemple, l'expression régulière `/The/gi` signifie: la lettre +`T` majuscule, suivie par le caractère `h` minscule, suivi par le caractère `e` minuscule. Et à la fin de l'expression régulière, le drapeau `i` dit au +moteur d'expression régulière d'ignorer la casse. Comme vous pouvez le voir, nous mettons aussi un drapeau `g` parce que nous voulons chercher le schéma dans +la string entière. + +
+"The" => The fat cat sat on the mat.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/dpQyf9/1) + +
+"/The/gi" => The fat cat sat on the mat.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/ahfiuh/1) + +### 5.2 Correspondance globale + +Le modifieur `g` est utilisé pour faire une recherche globale (trouver toutes les strings plutôt que de s'arrêter à la première correspondance ). Par exemple, +l'expression régulière `/.(at)/g` signifie: n'importe quel caractère sauf le retour de ligne, suivi par le caractère `a` minuscule, suivi par le caractère +`t` minuscule. Grâce au drapeau `g` à la fin de l'expression régulière maintenant il trouvera toutes les correspondances de toute la string. + +
+"/.(at)/" => The fat cat sat on the mat.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/jnk6gM/1) + +
+"/.(at)/g" => The fat cat sat on the mat.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/dO1nef/1) + +### 5.3 Multilignes + +Le modifieur `m` est utilisé pour trouver une correspondance multiligne. Comme mentionné plus tôt, les ancres `(^, $)` sont utilisés pour vérifier si le schéma +se trouve au début ou à la fin de la string. Mais si nous voulons que l'ancre soit sur chaque ligne nous utilisons le drapeau `m`. Par exemple, l'expression régulière +`/at(.)?$/gm` signifie: le caractère `a` minuscule, suivi par le caractère `t` minuscule, suivi par optionnellement n'importe quel caractère à part le retour de ligne. +Grâce au drapeau `m` maintenant le moteur d'expression régulière trouve le schéma à chaque début de ligne dans la string. + +
+"/.at(.)?$/" => The fat
+                cat sat
+                on the mat.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/hoGMkP/1) + +
+"/.at(.)?$/gm" => The fat
+                  cat sat
+                  on the mat.
+
+ +[Essayer l'expression régulière](https://regex101.com/r/E88WE2/1) + +## Contribution + +* Signaler les problèmes (issues) +* Ouvrir des "pull requests" pour les améliorations +* Parlez-en autour de vous ! +* Contactez moi en anglais à ziishaned@gmail.com ou [![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/ziishaned.svg?style=social&label=Follow%20%40ziishaned)](https://twitter.com/ziishaned) + +## License + +MIT © [Zeeshan Ahmed](mailto:ziishaned@gmail.com) diff --git a/README-ja.md b/README-ja.md index 523928e..bdce2ac 100644 --- a/README-ja.md +++ b/README-ja.md @@ -6,7 +6,8 @@ ## 翻訳 * [English](README.md) -* [Español](README-es.md) +* [Español](README-es.md) +* [Français](README-fr.md) * [中文版](README-cn.md) * [日本語](README-ja.md) diff --git a/README.md b/README.md index ece50f7..7a05ff3 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,8 @@ ## Translations: * [English](README.md) -* [Español](README-es.md) +* [Español](README-es.md) +* [Français](README-fr.md) * [中文版](README-cn.md) * [日本語](README-ja.md) @@ -260,6 +261,7 @@ or lowercase character `c`, followed by lowercase character `a`, followed by low Backslash `\` is used in regular expression to escape the next character. This allows us to specify a symbol as a matching character including reserved characters `{ } [ ] / \ + * . $ ^ | ?`. To use a special character as a matching character prepend `\` before it. + For example, the regular expression `.` is used to match any character except newline. Now to match `.` in an input string the regular expression `(f|c|m)at\.?` means: lowercase letter `f`, `c` or `m`, followed by lowercase character `a`, followed by lowercase letter `t`, followed by optional `.` character. From 4b641cd11de81057d9f5213766839d296b5c0a85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?= Date: Sat, 19 Aug 2017 01:59:19 +0200 Subject: [PATCH 20/36] RegExp image in french, typo corrected (#67) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Some typo corrected * Typographics rules (as space before :) * égual - égal --- README-fr.md | 86 ++++++++++++++++++++++++++-------------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/README-fr.md b/README-fr.md index 931abd1..729e2dd 100644 --- a/README-fr.md +++ b/README-fr.md @@ -24,7 +24,7 @@ le pseudonyme à contenir des lettres, des nombres, des underscores et des trait de caractères dans le pseudonyme pour qu'il n'ait pas l'air moche. Nous utilisons l'expression régulière suivante pour valider un pseudonyme:

-Regular expression +Expression régulière

L'expression régulière ci-dessus peut accepter les strings `john_doe`, `jo-hn_doe` et `john12_as`. Ça ne fonctionne pas avec `Jo` car @@ -62,7 +62,7 @@ cette string contient une lettre majuscule et elle est trop courte. ## 1. Introduction Une expression régulière est un schéma de caractères utilisés pour effectuer une recherche dans un text. -Par exemple, l'expression régulière `the` signifie: la lettre `t`, suivie de la lettre `h`, suivie de la lettre `e`. +Par exemple, l'expression régulière `the` signifie : la lettre `t`, suivie de la lettre `h`, suivie de la lettre `e`.
 "the" => The fat cat sat on the mat.
@@ -70,7 +70,7 @@ Par exemple, l'expression régulière `the` signifie: la lettre `t`, suivie de l
 
 [Essayer l'expression régulière](https://regex101.com/r/dmRygT/1)
 
-L'expression régulière `123` coïncide à la chaîne `123`. Chaque caractère de l'expression régulière est comparée à la chaine passée en entrée, caractère par caractère. Les expressions régulières sont normalement sensibles à la casse, donc l'expression régulière `The` ne va pas coïncider à la chaine de caractère `the`.
+L'expression régulière `123` coïncide à la chaîne `123`. Chaque caractère de l'expression régulière est comparée à la chaîne passée en entrée, caractère par caractère. Les expressions régulières sont normalement sensibles à la casse, donc l'expression régulière `The` ne va pas coïncider à la chaîne de caractère `the`.
 
 
 "The" => The fat cat sat on the mat.
@@ -100,7 +100,7 @@ Significations des meta-caractères:
 
 ## 2.1 Full stop
 
-Le full stop `.` est l'exemple le plus simple d'un meta-caratère. Le `.` coïncide avec n'importe quel caractère unique, mais ne coïncide pas avec les caractères de retour ou de nouvelle ligne. Par exemple, l'expression régulière `.ar` signifie: n'importe quel caractère suivi par la lettre `a`, suivie par la lettre `r`.
+Le full stop `.` est l'exemple le plus simple d'un meta-caratère. Le `.` coïncide avec n'importe quel caractère unique, mais ne coïncide pas avec les caractères de retour ou de nouvelle ligne. Par exemple, l'expression régulière `.ar` signifie : n'importe quel caractère suivi par la lettre `a`, suivie par la lettre `r`.
 
 
 ".ar" => The car parked in the garage.
@@ -110,7 +110,7 @@ Le full stop `.` est l'exemple le plus simple d'un meta-caratère. Le `.` coïnc
 
 ## 2.2 Inclusions de caractères
 
-Les inclusions de caractères sont également appelées classes de caractères. Les crochets sont utilisés pour spécifier les inclusions de caractères. Un trait d'union utilisé dans une inclusion de caractères permet de définir une gamme de caractères. L'ordre utilisé dans la gamme de caractère n'a pas d'importance. Par exemple, l'expression régulière `[Tt]he` signifie: un `T` majuscule ou `t` minucule, suivi par la lettre `h`, suivie par la lettre `e`.
+Les inclusions de caractères sont également appelées classes de caractères. Les crochets sont utilisés pour spécifier les inclusions de caractères. Un trait d'union utilisé dans une inclusion de caractères permet de définir une gamme de caractères. L'ordre utilisé dans la gamme de caractère n'a pas d'importance. Par exemple, l'expression régulière `[Tt]he` signifie : un `T` majuscule ou `t` minuscule, suivi par la lettre `h`, suivie par la lettre `e`.
 
 
 "[Tt]he" => The car parked in the garage.
@@ -118,7 +118,7 @@ Les inclusions de caractères sont également appelées classes de caractères.
 
 [Essayer l'expression régulière](https://regex101.com/r/2ITLQ4/1)
 
-L'utilisation du point dans une inclusion de caractère signifie toutefois un `.` littéral. L'expression régulière `ar[.]` signifie: un `a` minuscule, suivi par la lettre `r` minuscule, suvie par un `.` (point).
+L'utilisation du point dans une inclusion de caractère signifie toutefois un `.` littéral. L'expression régulière `ar[.]` signifie : un `a` minuscule, suivi par la lettre `r` minuscule, suivie par un `.` (point).
 
 
 "ar[.]" => A garage is a good place to park a car.
@@ -128,7 +128,7 @@ L'utilisation du point dans une inclusion de caractère signifie toutefois un `.
 
 ### 2.2.1 Exclusion de caractères
 
-En règle générale, le caractère circonflexe représente le début d'une chaîne de caractères. Néanmoins, lorsqu'il est utilisé après le crochet ouvrant, il permet d'exclure la gamme de caractère(s). Par exemple, l'expression régulière `[^c]ar` signifie: n'importe quel caractère sauf `c`, suivi par la lettre `a`, suivie par la lettre `r`.
+En règle générale, le caractère circonflexe représente le début d'une chaîne de caractères. Néanmoins, lorsqu'il est utilisé après le crochet ouvrant, il permet d'exclure la gamme de caractère(s). Par exemple, l'expression régulière `[^c]ar` signifie : n'importe quel caractère sauf `c`, suivi par la lettre `a`, suivie par la lettre `r`.
 
 
 "[^c]ar" => The car parked in the garage.
@@ -143,9 +143,9 @@ différemment selon la situation dans laquelle ils sont utilisés.
 
 ### 2.3.1 Astérisque
 
-Le symbole `*` correspond à zéro ou plus de répétitions du schéma précédent. L'expression régulière `a*` signifie: zéro ou plus de répétitions
+Le symbole `*` correspond à zéro ou plus de répétitions du schéma précédent. L'expression régulière `a*` signifie : zéro ou plus de répétitions
 du précédent `a` minuscule. Mais si il se trouve après une liste de caractères alors il s'agit de la répétition de la liste entière.
-Par exemple, l'expression régulière `[a-z]*` signifie: n'importe combien de lettres minuscules.
+Par exemple, l'expression régulière `[a-z]*` signifie : n'importe combien de lettres minuscules.
 
 
 "[a-z]*" => The car parked in the garage #21.
@@ -154,7 +154,7 @@ Par exemple, l'expression régulière `[a-z]*` signifie: n'importe combien de le
 [Essayer l'expression régulière](https://regex101.com/r/7m8me5/1)
 
 Le symbole `*` peut être utilisé avec le meta-caractère `.` pour correspondre à n'importe quelle chaîne de caractères `.*`. Le symbole `*` peut être utilisé avec le
-caractère espace vide `\s` pour correspondre à une chaîne d'espaces vides. Par exemple, l'expression `\s*cat\s*` signifie: zéro ou plus
+caractère espace vide `\s` pour correspondre à une chaîne d'espaces vides. Par exemple, l'expression `\s*cat\s*` signifie : zéro ou plus
 d'espaces, suivis du caractère `c` minuscule, suivi par le caractère `a` minuscule, suivi par le caractère `t` minuscule, suivi par
 zéro ou plus d'espaces.
 
@@ -166,7 +166,7 @@ zéro ou plus d'espaces.
 
 ### 2.3.2 Le Plus
 
-Le meta-caractère `+` correspond à une ou plusieurs répétitions du caractère précédent. Par exemple, l'expression régulière `c.+t` signifie: la lettre `c` minuscule, suivie par au moins un caractère, suivi par la lettre `t` minuscule. Le `t` coïncide par conséquent avec le dernier `t` de la phrase.
+Le meta-caractère `+` correspond à une ou plusieurs répétitions du caractère précédent. Par exemple, l'expression régulière `c.+t` signifie : la lettre `c` minuscule, suivie par au moins un caractère, suivi par la lettre `t` minuscule. Le `t` coïncide par conséquent avec le dernier `t` de la phrase.
 
 
 "c.+t" => The fat cat sat on the mat.
@@ -176,7 +176,7 @@ Le meta-caractère `+` correspond à une ou plusieurs répétitions du caractèr
 
 ### 2.3.3 Le point d'interrogation
 
-Le meta-caractère `?` rend le caractère précédent optionel. Ce symbole permet de faire coïncider 0 ou une instance du caractère précédent. Par exemple, l'expression régulière `[T]?he` signifie: la lettre `T` majuscule optionelle, suivie par la lettre `h` minuscule, suivie par la lettre `e` minuscule.
+Le meta-caractère `?` rend le caractère précédent optionnel. Ce symbole permet de faire coïncider 0 ou une instance du caractère précédent. Par exemple, l'expression régulière `[T]?he` signifie : la lettre `T` majuscule optionnelle, suivie par la lettre `h` minuscule, suivie par la lettre `e` minuscule.
 
 
 "[T]he" => The car is parked in the garage.
@@ -193,7 +193,7 @@ Le meta-caractère `?` rend le caractère précédent optionel. Ce symbole perme
 ## 2.4 Accolades
 
 Dans une expression régulière, les accolades, qui sont aussi appelée quantifieurs, sont utilisées pour spécifier le nombre de fois qu'un
-caractère ou un groupe de caractères peut être répété. Par exemple, l'expression régulière `[0-9]{2,3}` signifie: Trouve au moins 2 chiffres mais pas plus de 3
+caractère ou un groupe de caractères peut être répété. Par exemple, l'expression régulière `[0-9]{2,3}` signifie : trouve au moins 2 chiffres mais pas plus de 3
 (caractères dans la gamme de 0 à 9).
 
 
@@ -202,8 +202,8 @@ caractère ou un groupe de caractères peut être répété. Par exemple, l'expr
 
 [Essayer l'expression régulière](https://regex101.com/r/juM86s/1)
 
-Nous pouvons omettre le second nombre. Par exemple, l'expression régulière `[0-9]{2,}` signifie: Trouve 2 chiffres ou plus. Si nous supprimons aussi
-la virgule l'expression régulière `[0-9]{3}` signifie: Trouve exactement 3 chiffres.
+Nous pouvons omettre le second nombre. Par exemple, l'expression régulière `[0-9]{2,}` signifie : trouve 2 chiffres ou plus. Si nous supprimons aussi
+la virgule l'expression régulière `[0-9]{3}` signifie : trouve exactement 3 chiffres.
 
 
 "[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
@@ -219,10 +219,10 @@ la virgule l'expression régulière `[0-9]{3}` signifie: Trouve exactement 3 chi
 
 ## 2.5 Groupement de caractères
 
-Un groupement de caractères est un groupe de sous-schémas qui sont écris dans des parenthèses `(...)`. Nous avions mentionné plus tôt que, dans une expression régulière,
+Un groupement de caractères est un groupe de sous-schémas qui sont écrits dans des parenthèses `(...)`. Nous avions mentionné plus tôt que, dans une expression régulière,
 si nous mettons un quantifieur après un caractère alors le caractère précédent sera répété. Mais si nous mettons un quantifieur après un groupement de caractères alors
 il répète le groupement de caractères entier. Par exemple, l'expression régulière `(ab)*` trouve zéro ou plus de répétitions des caractères "ab".
-Nous pouvons aussi utiliser le meta-caractère d'alternation `|` à l'intérieur d'un groupement. Par exemple, l'expression régulière `(c|g|p)ar` signifie: caractère `c` minuscule,
+Nous pouvons aussi utiliser le meta-caractère d'alternation `|` à l'intérieur d'un groupement. Par exemple, l'expression régulière `(c|g|p)ar` signifie : caractère `c` minuscule,
 `g` ou `p`, suivi par le caractère `a`, suivi par le caractère `r`.
 
 
@@ -236,7 +236,7 @@ Nous pouvons aussi utiliser le meta-caractère d'alternation `|` à l'intérieur
 Dans une expression régulière, la barre verticale `|` est utilisée pour définir une alternation. L'alternation est comme une condition entre plusieurs expressions. Maintenant,
 nous pourrions penser que la liste de caractères et l'alternation sont la même chose. Mais la grande différence entre une liste de caractères et l'alternation
 est que la liste de caractères fonctionne au niveau des caractères mais l'alternation fonctionne au niveau de l'expression. Par exemple, l'expression régulière
-`(T|t)he|car` signifie: le caractère `T` majuscule ou `t` minuscule, suivi par le caractère `h` minuscule, suivi par le caractère `e` minuscule
+`(T|t)he|car` signifie : le caractère `T` majuscule ou `t` minuscule, suivi par le caractère `h` minuscule, suivi par le caractère `e` minuscule
 ou le caractère `c` minuscule, suivi par le caractère `a` minuscule, suivit par le caractère `r` minuscule.
 
 
@@ -250,7 +250,7 @@ ou le caractère `c` minuscule, suivi par le caractère `a` minuscule, suivit pa
 L'antislash `\` est utilisé dans les expressions régulières pour échapper (ignorer) le caractère suivant. Cela permet de spécifier un symbole comme caractère à trouver
 y compris les caractères réservés `{ } [ ] / \ + * . $ ^ | ?`. Pour utiliser un caractère spécial comme caractère à trouver, préfixer `\` avant celui-ci.
 Par exemple, l'expression régulière `.` est utilisée pour trouver n'importe quel caractère sauf le retour de ligne. Donc pour trouver `.` dans une string
-l'expression régulière `(f|c|m)at\.?` signifie: la lettre minuscule `f`, `c` ou `m`, suivie par le caractère `a` minuscule, suivi par la lettre
+l'expression régulière `(f|c|m)at\.?` signifie : la lettre minuscule `f`, `c` ou `m`, suivie par le caractère `a` minuscule, suivi par la lettre
 `t` minuscule, suivie par le caractère optionnel `.`.
 
 
@@ -262,7 +262,7 @@ l'expression régulière `(f|c|m)at\.?` signifie: la lettre minuscule `f`, `c` o
 ## 2.8 Ancres
 
 Dans les expressions régulières, nous utilisons des ancres pour vérifier si le symbole trouvé est le premier ou dernier symbole de la
-string. Il y a 2 types d'ancres: Le premier type est le circonflexe `^` qui cherche si le caractère est le premier
+string. Il y a 2 types d'ancres : Le premier type est le circonflexe `^` qui cherche si le caractère est le premier
 caractère de la string et le deuxième type est le Dollar `$` qui vérifie si le caractère est le dernier caractère de la string.
 
 ### 2.8.1 Circonflexe
@@ -270,7 +270,7 @@ caractère de la string et le deuxième type est le Dollar `$` qui vérifie si l
 Le symbole circonflexe `^` est utilisé pour vérifier si un caractère est le premier caractère de la string. Si nous appliquons l'expression régulière
 suivante `^a` (si a est le premier symbole) à la string `abc`, ça coïncide. Mais si nous appliquons l'expression régulière `^b` sur cette même string,
 ça ne coïncide pas. Parce que dans la string `abc` "b" n'est pas le premier symbole. Regardons une autre expression régulière
-`^(T|t)he` qui signifie: le caractère `T` majuscule ou le caractère `t` minuscule est le premier symbole de la string,
+`^(T|t)he` qui signifie : le caractère `T` majuscule ou le caractère `t` minuscule est le premier symbole de la string,
 suivi par le caractère `h` minuscule, suivi par le caractère `e` minuscule.
 
 
@@ -288,7 +288,7 @@ suivi par le caractère `h` minuscule, suivi par le caractère `e` minuscule.
 ### 2.8.2 Dollar
 
 Le symbole Dollar `$` est utilisé pour vérifier si un caractère est le dernier caractère d'une string. Par exemple, l'expression régulière
-`(at\.)$` signifie: un caractère `a` minuscule, suivi par un caractère `t` minuscule, suivi par un caractère `.` et tout cela doit être
+`(at\.)$` signifie : un caractère `a` minuscule, suivi par un caractère `t` minuscule, suivi par un caractère `.` et tout cela doit être
 à la fin de la string.
 
 
@@ -306,24 +306,24 @@ Le symbole Dollar `$` est utilisé pour vérifier si un caractère est le dernie
 ##  3. Liste de caractères abrégés
 
 Les expressions régulières fournissent des abréviations pour les listes de caractères, ce qui offres des raccourcis pratiques pour
-les expressions régulières souvent utilisées. Ces abréviations sont les suivantes:
+les expressions régulières souvent utilisées. Ces abréviations sont les suivantes :
 
 |Abréviation|Description|
 |:----:|----|
 |.|N'importe quel caractère à part le retour de ligne|
-|\w|Caractères alphanumériques: `[a-zA-Z0-9_]`|
-|\W|Caractères non-alphanumériques: `[^\w]`|
-|\d|Chiffres: `[0-9]`|
-|\D|Non-numériques: `[^\d]`|
-|\s|Espace vide: `[\t\n\f\r\p{Z}]`|
-|\S|Tout sauf espace vide: `[^\s]`|
+|\w|Caractères alphanumériques : `[a-zA-Z0-9_]`|
+|\W|Caractères non-alphanumériques : `[^\w]`|
+|\d|Chiffres : `[0-9]`|
+|\D|Non-numériques : `[^\d]`|
+|\s|Espace vide : `[\t\n\f\r\p{Z}]`|
+|\S|Tout sauf espace vide : `[^\s]`|
 
 ## 4. Recherche
 
 La recherche en avant et en arrière sont un type spécifique appelé ***groupe non-capturant*** (utilisés pour trouver un schéma mais pas
 pour l'inclure dans la liste de correspondance). Les recherches positives sont utilisées quand nous avons la condition qu'un schéma doit être précédé ou suivi
 par un autre schéma. Par exemple, nous voulons tous les chiffres qui sont précédés par le caractère `$` dans la string suivante `$4.44 and $10.88`.
-Nous allons utiliser l'expression régulière suivante `(?<=\$)[0-9\.]*` qui signifie: Trouver tous les nombres qui contiennent le caractère `.` et sont précédés
+Nous allons utiliser l'expression régulière suivante `(?<=\$)[0-9\.]*` qui signifie : trouver tous les nombres qui contiennent le caractère `.` et sont précédés
 par le caractère `$`. Les recherches que nous trouvons dans les expressions régulières sont les suivantes:
 
 |Symbole|Description|
@@ -337,8 +337,8 @@ par le caractère `$`. Les recherches que nous trouvons dans les expressions ré
 
 La recherche en avant assure que la première partie de l'expression soit suivie par l'expression recherchée. La valeur retournée
 contient uniquement le texte qui correspond à la première partie de l'expression. Pour définir une recherche en avant positive, on utilise
-des parenthèses. Entre ces parenthèses, un point d'interrogation avec un signe égual est utilisé comme ça: `(?=...)`. L'expression de recherche
-est écrite après le signe égual dans les parenthèses. Par exemple, l'expression régulière `[T|t]he(?=\sfat)` signifie: trouve optionnellement
+des parenthèses. Entre ces parenthèses, un point d'interrogation avec un signe égal est utilisé comme cela : `(?=...)`. L'expression de recherche
+est écrite après le signe égal dans les parenthèses. Par exemple, l'expression régulière `[T|t]he(?=\sfat)` signifie : trouve optionnellement
 la lettre `t` minuscule ou la lettre `T` majuscule, suivie par la lettre `h` minuscule, suivie par la lettre `e`. Entre parenthèses nous définissons
 la recherche en avant positive qui dit quelle est l'expression à chercher. `The` ou `the` qui sont suivies par le mot `fat` précédé d'un espace.
 
@@ -351,8 +351,8 @@ la recherche en avant positive qui dit quelle est l'expression à chercher. `The
 ### 4.2 Recherche en avant négative
 
 La recherche en avant négative est utilisée quand nous avons besoin de trouver une string qui n'est pas suivie d'un schéma. La recherche en avant négative
-est définie de la même manière que la recherche en avant positive mais la seule différence est qu'à la place du signe égual `=` nous utilisons le caractère de négation `!`
-i.e. `(?!...)`. Regardons l'expression régulière suivante `[T|t]he(?!\sfat)` qui signifie: trouve tous les mots `The` ou `the` de la string
+est définie de la même manière que la recherche en avant positive mais la seule différence est qu'à la place du signe égal `=` nous utilisons le caractère de négation `!`
+i.e. `(?!...)`. Regardons l'expression régulière suivante `[T|t]he(?!\sfat)` qui signifie : trouve tous les mots `The` ou `the` de la string
 qui ne sont pas suivis du mot `fat` précédé d'un espace.
 
 
@@ -364,7 +364,7 @@ qui ne sont pas suivis du mot `fat` précédé d'un espace.
 ### 4.3 Recherche en arrière positive
 
 La recherche en arrière positive est utilisée pour trouver une string précédée d'un schéma. La recherche en arrière positive se note
-`(?<=...)`. Par exemple, l'expression régulière `(?<=[T|t]he\s)(fat|mat)` signifie: trouve tous les mots `fat` ou `mat` de la string qui
+`(?<=...)`. Par exemple, l'expression régulière `(?<=[T|t]he\s)(fat|mat)` signifie : trouve tous les mots `fat` ou `mat` de la string qui
 se trouve après le mot `The` ou `the`.
 
 
@@ -376,7 +376,7 @@ se trouve après le mot `The` ou `the`.
 ### 4.4 Recherche en arrière négative
 
 La recherche en arrière négative est utilisée pour trouver une string qui n'est pas précédée d'un schéma. La recherche en arrière négative se note
-`(?
@@ -392,14 +392,14 @@ dans n'importe quel ordre et combinaison et font partie intégrante de la RegExp
 
 |Drapeau|Description|
 |:----:|----|
-|i|Insensible à la casse: Définit que la correspondance sera insensible à la casse.|
-|g|Recherche globale: Recherche la correspondance dans la string entière.|
-|m|Multiligne: Meta-caractère ancre qui agit sur toutes les lignes.|
+|i|Insensible à la casse : Définit que la correspondance sera insensible à la casse.|
+|g|Recherche globale : Recherche la correspondance dans la string entière.|
+|m|Multiligne : Meta-caractère ancre qui agit sur toutes les lignes.|
 
 ### 5.1 Insensible à la casse
 
-Le modifieur `i` est utilisé pour faire une correspondance insensible à la casse. Par exemple, l'expression régulière `/The/gi` signifie: la lettre
-`T` majuscule, suivie par le caractère `h` minscule, suivi par le caractère `e` minuscule. Et à la fin de l'expression régulière, le drapeau `i` dit au
+Le modifieur `i` est utilisé pour faire une correspondance insensible à la casse. Par exemple, l'expression régulière `/The/gi` signifie : la lettre
+`T` majuscule, suivie par le caractère `h` minuscule, suivi par le caractère `e` minuscule. Et à la fin de l'expression régulière, le drapeau `i` dit au
 moteur d'expression régulière d'ignorer la casse. Comme vous pouvez le voir, nous mettons aussi un drapeau `g` parce que nous voulons chercher le schéma dans
 la string entière.
 
@@ -418,7 +418,7 @@ la string entière.
 ### 5.2 Correspondance globale
 
 Le modifieur `g` est utilisé pour faire une recherche globale (trouver toutes les strings plutôt que de s'arrêter à la première correspondance ). Par exemple,
-l'expression régulière `/.(at)/g` signifie: n'importe quel caractère sauf le retour de ligne, suivi par le caractère `a` minuscule, suivi par le caractère
+l'expression régulière `/.(at)/g` signifie : n'importe quel caractère sauf le retour de ligne, suivi par le caractère `a` minuscule, suivi par le caractère
 `t` minuscule. Grâce au drapeau `g` à la fin de l'expression régulière maintenant il trouvera toutes les correspondances de toute la string.
 
 
@@ -437,7 +437,7 @@ l'expression régulière `/.(at)/g` signifie: n'importe quel caractère sauf le
 
 Le modifieur `m` est utilisé pour trouver une correspondance multiligne. Comme mentionné plus tôt, les ancres `(^, $)` sont utilisés pour vérifier si le schéma
 se trouve au début ou à la fin de la string. Mais si nous voulons que l'ancre soit sur chaque ligne nous utilisons le drapeau `m`. Par exemple, l'expression régulière
-`/at(.)?$/gm` signifie: le caractère `a` minuscule, suivi par le caractère `t` minuscule, suivi par optionnellement n'importe quel caractère à part le retour de ligne.
+`/at(.)?$/gm` signifie : le caractère `a` minuscule, suivi par le caractère `t` minuscule, suivi par optionnellement n'importe quel caractère à part le retour de ligne.
 Grâce au drapeau `m` maintenant le moteur d'expression régulière trouve le schéma à chaque début de ligne dans la string.
 
 

From 9968a235b6bc12b95fbfe3fb9a09a4daf7bcdae5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?=
 
Date: Sat, 19 Aug 2017 11:15:19 +0200
Subject: [PATCH 21/36] Homogenized images (#69)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* RegExp image for French plus

* Some typo corrected
* Typographics rules (as space before :)
* égual - égal

* Images folder added, img src updated

* § formatted to 80 lines
---
 README-es.md         |   2 +-
 README-fr.md         |   2 +-
 README-ja.md         |   2 +-
 README.md            | 282 ++++++++++++++++++------------
 img/img_original.png | Bin 0 -> 6634 bytes
 img/regexp-en.png    | Bin 0 -> 32144 bytes
 img/regexp-es.png    | Bin 0 -> 34234 bytes
 img/regexp-fr.png    | Bin 0 -> 32922 bytes
 img/regexp.svg       | 397 +++++++++++++++++++++++++++++++++++++++++++
 9 files changed, 573 insertions(+), 112 deletions(-)
 create mode 100644 img/img_original.png
 create mode 100644 img/regexp-en.png
 create mode 100644 img/regexp-es.png
 create mode 100644 img/regexp-fr.png
 create mode 100644 img/regexp.svg

diff --git a/README-es.md b/README-es.md
index 6988406..82ec6f6 100644
--- a/README-es.md
+++ b/README-es.md
@@ -21,7 +21,7 @@ Imagina que estas escribiendo una aplicación y quieres agregar reglas para cuan
 
 

-Regular expression + Expresión regular

De la expresión regular anterior, se puede aceptar las cadenas 'john_doe', 'jo-hn_doe' y 'john12_as'. La expresión no coincide con el nombre de usuario 'Jo', porque es una cadena de caracteres que contiene letras mayúsculas y es demasiado corta. diff --git a/README-fr.md b/README-fr.md index 729e2dd..126ca62 100644 --- a/README-fr.md +++ b/README-fr.md @@ -24,7 +24,7 @@ le pseudonyme à contenir des lettres, des nombres, des underscores et des trait de caractères dans le pseudonyme pour qu'il n'ait pas l'air moche. Nous utilisons l'expression régulière suivante pour valider un pseudonyme:

-Expression régulière + Expressions régulières

L'expression régulière ci-dessus peut accepter les strings `john_doe`, `jo-hn_doe` et `john12_as`. Ça ne fonctionne pas avec `Jo` car diff --git a/README-ja.md b/README-ja.md index bdce2ac..8fb870b 100644 --- a/README-ja.md +++ b/README-ja.md @@ -27,7 +27,7 @@

-Regular expression + Regular expression

この正規表現によって `john_doe, jo-hn_doe, john12_as` などは許容されることになります。 diff --git a/README.md b/README.md index 7a05ff3..823ce08 100644 --- a/README.md +++ b/README.md @@ -15,20 +15,26 @@ > Regular expression is a group of characters or symbols which is used to find a specific pattern from a text. -A regular expression is a pattern that is matched against a subject string from left to right. The word "Regular expression" is a -mouthful, you will usually find the term abbreviated as "regex" or "regexp". Regular expression is used for replacing a text within -a string, validating form, extract a substring from a string based upon a pattern match, and so much more. +A regular expression is a pattern that is matched against a subject string from +left to right. The word "Regular expression" is a mouthful, you will usually +find the term abbreviated as "regex" or "regexp". Regular expression is used for +replacing a text within a string, validating form, extract a substring from a +string based upon a pattern match, and so much more. + +Imagine you are writing an application and you want to set the rules for when a +user chooses their username. We want to allow the username to contain letters, +numbers, underscores and hyphens. We also want to limit the number of characters +in username so it does not look ugly. We use the following regular expression to +validate a username: -Imagine you are writing an application and you want to set the rules for when a user chooses their username. We want to -allow the username to contain letters, numbers, underscores and hyphens. We also want to limit the number of -characters in username so it does not look ugly. We use the following regular expression to validate a username:

-Regular expression + Regular expression

-Above regular expression can accept the strings `john_doe`, `jo-hn_doe` and `john12_as`. It does not match `Jo` because that string -contains uppercase letter and also it is too short. +Above regular expression can accept the strings `john_doe`, `jo-hn_doe` and +`john12_as`. It does not match `Jo` because that string contains uppercase +letter and also it is too short. ## Table of Contents @@ -61,8 +67,9 @@ contains uppercase letter and also it is too short. ## 1. Basic Matchers -A regular expression is just a pattern of characters that we use to perform search in a text. For example, the regular expression -`the` means: the letter `t`, followed by the letter `h`, followed by the letter `e`. +A regular expression is just a pattern of characters that we use to perform +search in a text. For example, the regular expression `the` means: the letter +`t`, followed by the letter `h`, followed by the letter `e`.
 "the" => The fat cat sat on the mat.
@@ -70,9 +77,11 @@ A regular expression is just a pattern of characters that we use to perform sear
 
 [Test the regular expression](https://regex101.com/r/dmRygT/1)
 
-The regular expression `123` matches the string `123`. The regular expression is matched against an input string by comparing each
-character in the regular expression to each character in the input string, one after another. Regular expressions are normally
-case-sensitive so the regular expression `The` would not match the string `the`.
+The regular expression `123` matches the string `123`. The regular expression is
+matched against an input string by comparing each character in the regular
+expression to each character in the input string, one after another. Regular
+expressions are normally case-sensitive so the regular expression `The` would
+not match the string `the`.
 
 
 "The" => The fat cat sat on the mat.
@@ -82,9 +91,10 @@ case-sensitive so the regular expression `The` would not match the string `the`.
 
 ## 2. Meta Characters
 
-Meta characters are the building blocks of the regular expressions.  Meta characters do not stand for themselves but instead are
-interpreted in some special way. Some meta characters have a special meaning and are written inside square brackets.
-The meta characters are as follows:
+Meta characters are the building blocks of the regular expressions.  Meta
+characters do not stand for themselves but instead are interpreted in some
+special way. Some meta characters have a special meaning and are written inside
+square brackets. The meta characters are as follows:
 
 |Meta character|Description|
 |:----:|----|
@@ -103,9 +113,10 @@ The meta characters are as follows:
 
 ## 2.1 Full stop
 
-Full stop `.` is the simplest example of meta character. The meta character `.` matches any single character. It will not match return 
-or newline characters. For example, the regular expression `.ar` means: any character, followed by the letter `a`, followed by the 
-letter `r`.
+Full stop `.` is the simplest example of meta character. The meta character `.`
+matches any single character. It will not match return or newline characters.
+For example, the regular expression `.ar` means: any character, followed by the
+letter `a`, followed by the letter `r`.
 
 
 ".ar" => The car parked in the garage.
@@ -115,9 +126,11 @@ letter `r`.
 
 ## 2.2 Character set
 
-Character sets are also called character class. Square brackets are used to specify character sets. Use a hyphen inside a character set to
-specify the characters' range. The order of the character range inside square brackets doesn't matter. For example, the regular
-expression `[Tt]he` means: an uppercase `T` or lowercase `t`, followed by the letter `h`, followed by the letter `e`.
+Character sets are also called character class. Square brackets are used to
+specify character sets. Use a hyphen inside a character set to specify the
+characters' range. The order of the character range inside square brackets
+doesn't matter. For example, the regular expression `[Tt]he` means: an uppercase
+`T` or lowercase `t`, followed by the letter `h`, followed by the letter `e`.
 
 
 "[Tt]he" => The car parked in the garage.
@@ -125,7 +138,9 @@ expression `[Tt]he` means: an uppercase `T` or lowercase `t`, followed by the le
 
 [Test the regular expression](https://regex101.com/r/2ITLQ4/1)
 
-A period inside a character set, however, means a literal period. The regular expression `ar[.]` means: a lowercase character `a`, followed by letter `r`, followed by a period `.` character.
+A period inside a character set, however, means a literal period. The regular
+expression `ar[.]` means: a lowercase character `a`, followed by letter `r`,
+followed by a period `.` character.
 
 
 "ar[.]" => A garage is a good place to park a car.
@@ -135,9 +150,10 @@ A period inside a character set, however, means a literal period. The regular ex
 
 ### 2.2.1 Negated character set
 
-In general, the caret symbol represents the start of the string, but when it is typed after the opening square bracket it negates the
-character set. For example, the regular expression `[^c]ar` means: any character except `c`, followed by the character `a`, followed by
-the letter `r`.
+In general, the caret symbol represents the start of the string, but when it is
+typed after the opening square bracket it negates the character set. For
+example, the regular expression `[^c]ar` means: any character except `c`,
+followed by the character `a`, followed by the letter `r`.
 
 
 "[^c]ar" => The car parked in the garage.
@@ -147,14 +163,17 @@ the letter `r`.
 
 ## 2.3 Repetitions
 
-Following meta characters `+`, `*` or `?` are used to specify how many times a subpattern can occur. These meta characters act
-differently in different situations.
+Following meta characters `+`, `*` or `?` are used to specify how many times a
+subpattern can occur. These meta characters act differently in different
+situations.
 
 ### 2.3.1 The Star
 
-The symbol `*` matches zero or more repetitions of the preceding matcher. The regular expression `a*` means: zero or more repetitions
-of preceding lowercase character `a`. But if it appears after a character set or class then it finds the repetitions of the whole
-character set. For example, the regular expression `[a-z]*` means: any number of lowercase letters in a row.
+The symbol `*` matches zero or more repetitions of the preceding matcher. The
+regular expression `a*` means: zero or more repetitions of preceding lowercase
+character `a`. But if it appears after a character set or class then it finds
+the repetitions of the whole character set. For example, the regular expression
+`[a-z]*` means: any number of lowercase letters in a row.
 
 
 "[a-z]*" => The car parked in the garage #21.
@@ -162,10 +181,12 @@ character set. For example, the regular expression `[a-z]*` means: any number of
 
 [Test the regular expression](https://regex101.com/r/7m8me5/1)
 
-The `*` symbol can be used with the meta character `.` to match any string of characters `.*`. The `*` symbol can be used with the
-whitespace character `\s` to match a string of whitespace characters. For example, the expression `\s*cat\s*` means: zero or more
-spaces, followed by lowercase character `c`, followed by lowercase character `a`, followed by lowercase character `t`, followed by
-zero or more spaces.
+The `*` symbol can be used with the meta character `.` to match any string of
+characters `.*`. The `*` symbol can be used with the whitespace character `\s`
+to match a string of whitespace characters. For example, the expression
+`\s*cat\s*` means: zero or more spaces, followed by lowercase character `c`,
+followed by lowercase character `a`, followed by lowercase character `t`,
+followed by zero or more spaces.
 
 
 "\s*cat\s*" => The fat cat sat on the concatenation.
@@ -175,8 +196,10 @@ zero or more spaces.
 
 ### 2.3.2 The Plus
 
-The symbol `+` matches one or more repetitions of the preceding character. For example, the regular expression `c.+t` means: lowercase
-letter `c`, followed by at least one character, followed by the lowercase character `t`. It needs to be clarified that `t` is the last `t` in the sentence.
+The symbol `+` matches one or more repetitions of the preceding character. For
+example, the regular expression `c.+t` means: lowercase letter `c`, followed by
+at least one character, followed by the lowercase character `t`. It needs to be
+clarified that `t` is the last `t` in the sentence.
 
 
 "c.+t" => The fat cat sat on the mat.
@@ -186,9 +209,11 @@ letter `c`, followed by at least one character, followed by the lowercase charac
 
 ### 2.3.3 The Question Mark
 
-In regular expression the meta character `?` makes the preceding character optional. This symbol matches zero or one instance of
-the preceding character. For example, the regular expression `[T]?he` means: Optional the uppercase letter `T`, followed by the lowercase
-character `h`, followed by the lowercase character `e`.
+In regular expression the meta character `?` makes the preceding character
+optional. This symbol matches zero or one instance of the preceding character.
+For example, the regular expression `[T]?he` means: Optional the uppercase
+letter `T`, followed by the lowercase character `h`, followed by the lowercase
+character `e`.
 
 
 "[T]he" => The car is parked in the garage.
@@ -204,9 +229,10 @@ character `h`, followed by the lowercase character `e`.
 
 ## 2.4 Braces
 
-In  regular expression braces that are also called quantifiers are used to specify the number of times that a
-character or a group of characters can be repeated. For example, the regular expression `[0-9]{2,3}` means: Match at least 2 digits but not more than 3 (
-characters in the range of 0 to 9).
+In regular expression braces that are also called quantifiers are used to
+specify the number of times that a character or a group of characters can be
+repeated. For example, the regular expression `[0-9]{2,3}` means: Match at least
+2 digits but not more than 3 ( characters in the range of 0 to 9).
 
 
 "[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
@@ -214,8 +240,9 @@ characters in the range of 0 to 9).
 
 [Test the regular expression](https://regex101.com/r/juM86s/1)
 
-We can leave out the second number. For example, the regular expression `[0-9]{2,}` means: Match 2 or more digits. If we also remove
-the comma the regular expression `[0-9]{3}` means: Match exactly 3 digits.
+We can leave out the second number. For example, the regular expression
+`[0-9]{2,}` means: Match 2 or more digits. If we also remove the comma the
+regular expression `[0-9]{3}` means: Match exactly 3 digits.
 
 
 "[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
@@ -231,10 +258,13 @@ the comma the regular expression `[0-9]{3}` means: Match exactly 3 digits.
 
 ## 2.5 Character Group
 
-Character group is a group of sub-patterns that is written inside Parentheses `(...)`. As we discussed before that in regular expression
-if we put a quantifier after a character then it will repeat the preceding character. But if we put quantifier after a character group then
-it repeats the whole character group. For example, the regular expression `(ab)*` matches zero or more repetitions of the character "ab".
-We can also use the alternation `|` meta character inside character group. For example, the regular expression `(c|g|p)ar` means: lowercase character `c`,
+Character group is a group of sub-patterns that is written inside Parentheses `(...)`.
+As we discussed before that in regular expression if we put a quantifier after a
+character then it will repeat the preceding character. But if we put quantifier
+after a character group then it repeats the whole character group. For example,
+the regular expression `(ab)*` matches zero or more repetitions of the character
+"ab". We can also use the alternation `|` meta character inside character group.
+For example, the regular expression `(c|g|p)ar` means: lowercase character `c`,
 `g` or `p`, followed by character `a`, followed by character `r`.
 
 
@@ -245,11 +275,15 @@ We can also use the alternation `|` meta character inside character group. For e
 
 ## 2.6 Alternation
 
-In regular expression Vertical bar `|` is used to define alternation. Alternation is like a condition between multiple expressions. Now,
-you may be thinking that character set and alternation works the same way. But the big difference between character set and alternation
-is that character set works on character level but alternation works on expression level. For example, the regular expression
-`(T|t)he|car` means: uppercase character `T` or lowercase `t`, followed by lowercase character `h`, followed by lowercase character `e`
-or lowercase character `c`, followed by lowercase character `a`, followed by lowercase character `r`.
+In regular expression Vertical bar `|` is used to define alternation.
+Alternation is like a condition between multiple expressions. Now, you may be
+thinking that character set and alternation works the same way. But the big
+difference between character set and alternation is that character set works on
+character level but alternation works on expression level. For example, the
+regular expression `(T|t)he|car` means: uppercase character `T` or lowercase
+`t`, followed by lowercase character `h`, followed by lowercase character `e` or
+lowercase character `c`, followed by lowercase character `a`, followed by
+lowercase character `r`.
 
 
 "(T|t)he|car" => The car is parked in the garage.
@@ -259,12 +293,16 @@ or lowercase character `c`, followed by lowercase character `a`, followed by low
 
 ## 2.7 Escaping special character
 
-Backslash `\` is used in regular expression to escape the next character. This allows us to specify a symbol as a matching character 
-including reserved characters `{ } [ ] / \ + * . $ ^ | ?`. To use a special character as a matching character prepend `\` before it. 
+Backslash `\` is used in regular expression to escape the next character. This
+allows us to specify a symbol as a matching character including reserved
+characters `{ } [ ] / \ + * . $ ^ | ?`. To use a special character as a matching
+character prepend `\` before it.
 
-For example, the regular expression `.` is used to match any character except newline. Now to match `.` in an input string the regular
-expression `(f|c|m)at\.?` means: lowercase letter `f`, `c` or `m`, followed by lowercase character `a`, followed by lowercase letter 
-`t`, followed by optional `.` character.
+For example, the regular expression `.` is used to match any character except
+newline. Now to match `.` in an input string the regular expression
+`(f|c|m)at\.?` means: lowercase letter `f`, `c` or `m`, followed by lowercase
+character `a`, followed by lowercase letter `t`, followed by optional `.`
+character.
 
 
 "(f|c|m)at\.?" => The fat cat sat on the mat.
@@ -274,18 +312,22 @@ expression `(f|c|m)at\.?` means: lowercase letter `f`, `c` or `m`, followed by l
 
 ## 2.8 Anchors
 
-In regular expressions, we use anchors to check if the matching symbol is the starting symbol or ending symbol of the
-input string. Anchors are of two types: First type is Caret `^` that check if the matching character is the start
-character of the input and the second type is Dollar `$` that checks if matching character is the last character of the
-input string.
+In regular expressions, we use anchors to check if the matching symbol is the
+starting symbol or ending symbol of the input string. Anchors are of two types:
+First type is Caret `^` that check if the matching character is the start
+character of the input and the second type is Dollar `$` that checks if matching
+character is the last character of the input string.
 
 ### 2.8.1 Caret
 
-Caret `^` symbol is used to check if matching character is the first character of the input string. If we apply the following regular
-expression `^a` (if a is the starting symbol) to input string `abc` it matches `a`. But if we apply regular expression `^b` on above
-input string it does not match anything. Because in input string `abc` "b" is not the starting symbol. Let's take a look at another
-regular expression `^(T|t)he` which means: uppercase character `T` or lowercase character `t` is the start symbol of the input string,
-followed by lowercase character `h`, followed by lowercase character `e`.
+Caret `^` symbol is used to check if matching character is the first character
+of the input string. If we apply the following regular expression `^a` (if a is
+the starting symbol) to input string `abc` it matches `a`. But if we apply
+regular expression `^b` on above input string it does not match anything.
+Because in input string `abc` "b" is not the starting symbol. Let's take a look
+at another regular expression `^(T|t)he` which means: uppercase character `T` or
+lowercase character `t` is the start symbol of the input string, followed by
+lowercase character `h`, followed by lowercase character `e`.
 
 
 "(T|t)he" => The car is parked in the garage.
@@ -301,9 +343,10 @@ followed by lowercase character `h`, followed by lowercase character `e`.
 
 ### 2.8.2 Dollar
 
-Dollar `$` symbol is used to check if matching character is the last character of the input string. For example, regular expression
-`(at\.)$` means: a lowercase character `a`, followed by lowercase character `t`, followed by a `.` character and the matcher
-must be end of the string.
+Dollar `$` symbol is used to check if matching character is the last character
+of the input string. For example, regular expression `(at\.)$` means: a
+lowercase character `a`, followed by lowercase character `t`, followed by a `.`
+character and the matcher must be end of the string.
 
 
 "(at\.)" => The fat cat. sat. on the mat.
@@ -319,8 +362,9 @@ must be end of the string.
 
 ##  3. Shorthand Character Sets
 
-Regular expression provides shorthands for the commonly used character sets, which offer convenient shorthands for commonly used
-regular expressions. The shorthand character sets are as follows:
+Regular expression provides shorthands for the commonly used character sets,
+which offer convenient shorthands for commonly used regular expressions. The
+shorthand character sets are as follows:
 
 |Shorthand|Description|
 |:----:|----|
@@ -334,11 +378,15 @@ regular expressions. The shorthand character sets are as follows:
 
 ## 4. Lookaround
 
-Lookbehind and lookahead sometimes known as lookaround are specific type of ***non-capturing group*** (Use to match the pattern but not
-included in matching list). Lookaheads are used when we have the condition that this pattern is preceded or followed by another certain
-pattern. For example, we want to get all numbers that are preceded by `$` character from the following input string `$4.44 and $10.88`.
-We will use following regular expression `(?<=\$)[0-9\.]*` which means: get all the numbers which contain `.` character and  are preceded
-by `$` character. Following are the lookarounds that are used in regular expressions:
+Lookbehind and lookahead sometimes known as lookaround are specific type of
+***non-capturing group*** (Use to match the pattern but not included in matching
+list). Lookaheads are used when we have the condition that this pattern is
+preceded or followed by another certain pattern. For example, we want to get all
+numbers that are preceded by `$` character from the following input string
+`$4.44 and $10.88`. We will use following regular expression `(?<=\$)[0-9\.]*`
+which means: get all the numbers which contain `.` character and  are preceded
+by `$` character. Following are the lookarounds that are used in regular
+expressions:
 
 |Symbol|Description|
 |:----:|----|
@@ -349,12 +397,16 @@ by `$` character. Following are the lookarounds that are used in regular express
 
 ### 4.1 Positive Lookahead
 
-The positive lookahead asserts that the first part of the expression must be followed by the lookahead expression. The returned match
-only contains the text that is matched by the first part of the expression. To define a positive lookahead, parentheses are used. Within
-those parentheses, a question mark with equal sign is used like this: `(?=...)`. Lookahead expression is written after the equal sign inside
-parentheses. For example, the regular expression `[T|t]he(?=\sfat)` means: optionally match lowercase letter `t` or uppercase letter `T`,
-followed by letter `h`, followed by letter `e`. In parentheses we define positive lookahead which tells regular expression engine to match
-`The` or `the` which are followed by the word `fat`.
+The positive lookahead asserts that the first part of the expression must be
+followed by the lookahead expression. The returned match only contains the text
+that is matched by the first part of the expression. To define a positive
+lookahead, parentheses are used. Within those parentheses, a question mark with
+equal sign is used like this: `(?=...)`. Lookahead expression is written after
+the equal sign inside parentheses. For example, the regular expression
+`[T|t]he(?=\sfat)` means: optionally match lowercase letter `t` or uppercase
+letter `T`, followed by letter `h`, followed by letter `e`. In parentheses we
+define positive lookahead which tells regular expression engine to match `The`
+or `the` which are followed by the word `fat`.
 
 
 "[T|t]he(?=\sfat)" => The fat cat sat on the mat.
@@ -364,10 +416,13 @@ followed by letter `h`, followed by letter `e`. In parentheses we define positiv
 
 ### 4.2 Negative Lookahead
 
-Negative lookahead is used when we need to get all matches from input string that are not followed by a pattern. Negative lookahead
-defined same as we define positive lookahead but the only difference is instead of equal `=` character we use negation `!` character
-i.e. `(?!...)`. Let's take a look at the following regular expression `[T|t]he(?!\sfat)` which means: get all `The` or `the` words from
-input string that are not followed by the word `fat` precedes by a space character.
+Negative lookahead is used when we need to get all matches from input string
+that are not followed by a pattern. Negative lookahead defined same as we define
+positive lookahead but the only difference is instead of equal `=` character we
+use negation `!` character i.e. `(?!...)`. Let's take a look at the following
+regular expression `[T|t]he(?!\sfat)` which means: get all `The` or `the` words
+from input string that are not followed by the word `fat` precedes by a space
+character.
 
 
 "[T|t]he(?!\sfat)" => The fat cat sat on the mat.
@@ -377,9 +432,10 @@ input string that are not followed by the word `fat` precedes by a space charact
 
 ### 4.3 Positive Lookbehind
 
-Positive lookbehind is used to get all the matches that are preceded by a specific pattern. Positive lookbehind is denoted by
-`(?<=...)`. For example, the regular expression `(?<=[T|t]he\s)(fat|mat)` means: get all `fat` or `mat` words from input string that
-are after the word `The` or `the`.
+Positive lookbehind is used to get all the matches that are preceded by a
+specific pattern. Positive lookbehind is denoted by `(?<=...)`. For example, the
+regular expression `(?<=[T|t]he\s)(fat|mat)` means: get all `fat` or `mat` words
+from input string that are after the word `The` or `the`.
 
 
 "(?<=[T|t]he\s)(fat|mat)" => The fat cat sat on the mat.
@@ -389,9 +445,10 @@ are after the word `The` or `the`.
 
 ### 4.4 Negative Lookbehind
 
-Negative lookbehind is used to get all the matches that are not preceded by a specific pattern. Negative lookbehind is denoted by
-`(?
 "(?<![T|t]he\s)(cat)" => The cat sat on cat.
@@ -401,8 +458,9 @@ are not after the word `The` or `the`.
 
 ## 5. Flags
 
-Flags are also called modifiers because they modify the output of a regular expression. These flags can be used in any order or
-combination, and are an integral part of the RegExp.
+Flags are also called modifiers because they modify the output of a regular
+expression. These flags can be used in any order or combination, and are an
+integral part of the RegExp.
 
 |Flag|Description|
 |:----:|----|
@@ -412,10 +470,12 @@ combination, and are an integral part of the RegExp.
 
 ### 5.1 Case Insensitive
 
-The `i` modifier is used to perform case-insensitive matching. For example, the regular expression `/The/gi` means: uppercase letter
-`T`, followed by lowercase character `h`, followed by character `e`. And at the end of regular expression the `i` flag tells the
-regular expression engine to ignore the case. As you can see we also provided `g` flag because we want to search for the pattern in
-the whole input string.
+The `i` modifier is used to perform case-insensitive matching. For example, the
+regular expression `/The/gi` means: uppercase letter `T`, followed by lowercase
+character `h`, followed by character `e`. And at the end of regular expression
+the `i` flag tells the regular expression engine to ignore the case. As you can
+see we also provided `g` flag because we want to search for the pattern in the
+whole input string.
 
 
 "The" => The fat cat sat on the mat.
@@ -431,10 +491,11 @@ the whole input string.
 
 ### 5.2 Global search
 
-The `g` modifier is used to perform a global match (find all matches rather than stopping after the first match). For example, the
-regular expression`/.(at)/g` means: any character except new line, followed by lowercase character `a`, followed by lowercase
-character `t`. Because we provided `g` flag at the end of the regular expression now it will find every matches from whole input
-string.
+The `g` modifier is used to perform a global match (find all matches rather than
+stopping after the first match). For example, the regular expression`/.(at)/g`
+means: any character except new line, followed by lowercase character `a`,
+followed by lowercase character `t`. Because we provided `g` flag at the end of
+the regular expression now it will find every matches from whole input string.
 
 
 "/.(at)/" => The fat cat sat on the mat.
@@ -450,10 +511,13 @@ string.
 
 ### 5.3 Multiline
 
-The `m` modifier is used to perform a multi-line match. As we discussed earlier anchors `(^, $)` are used to check if pattern is
-the beginning of the input or end of the input string. But if we want that anchors works on each line we use `m` flag. For example, the
-regular expression `/at(.)?$/gm` means: lowercase character `a`, followed by lowercase character `t`, optionally anything except new
-line. And because of `m` flag now regular expression engine matches pattern at the end of each line in a string.
+The `m` modifier is used to perform a multi-line match. As we discussed earlier
+anchors `(^, $)` are used to check if pattern is the beginning of the input or
+end of the input string. But if we want that anchors works on each line we use
+`m` flag. For example, the regular expression `/at(.)?$/gm` means: lowercase
+character `a`, followed by lowercase character `t`, optionally anything except
+new line. And because of `m` flag now regular expression engine matches pattern
+at the end of each line in a string.
 
 
 "/.at(.)?$/" => The fat
diff --git a/img/img_original.png b/img/img_original.png
new file mode 100644
index 0000000000000000000000000000000000000000..da1c5fa2ac5822e8bccf3661f0ac720a011fc484
GIT binary patch
literal 6634
zcmbVQd0bQXvOke3A|Pn2VUZxA!bM~i2y0LQ5m8WVMGFK4g(^E?3n73T20<_tStLMl
zVQFPkAqgZz1tH231WJHlq7XJi2!tiFzk|K+-QM2YzWd(!BcGF*-^~2xcjh37
z;wZmGWeWfR@=izW-2h+%762e6n>T?J%WE?=0H9puWPkA6n112=He&9Xhl%HnLpMJ=
zFH)rW4J&GWbtrT*`dRp9=vDV8YFF*X6c=j)Y6YKs6K5JATgR|Je;X-6o_4lOY}Y+d
zatT!VKTqO5VF5?bT4pnjO}&@aRcYu_Dp4;B2kw|*Yw|sw#%p*UMUD0vQ84^!ZD|vL
z6imvoUwVPRoNpdb(Cyp&nP606BhGxFXS!YZM(RW96XD5Ne8Fx9E~?P@wDG3sbZa2S
zG9Bv2P)tNr(DV^MIpi~?5(Dvre6Fbgw*n9GdbN^;xDe~oR~gPIW9hMb9~GP;yYq+B
zUYdxDaM5-*Ge+BUtgOUttf2tymJ61f>>PXn;5!HOSY@a>f!2|=BQ1@lKRwroBA;&_
z-2uhgy%NjN%WdW#z_($2hrzW@P`~!V+KlAD@eWa?F+@T4?t~KI0bRTA@!wQ;!j}ll
z7PV_p!xpo;E&g(;FDWyY9%7WciWETTL@wOSIeMeJlZTZn8t0Pr4U;F8vH0E0BtJaM
zwQQ8HXH!gNKrPcl0^h2u*zOfyR+j>f7)KNKnpoW1Qfj1#U3vQ`?lAv`mgqzxT9^XE
zv=l2`4;*8#Rj}?#QUKG~rs5YqIlyi-RnGz4o`1(i(_oft_cHV*Q}sTjffb!bd)5R1
zW?1V~&exkuvt>^5ldXx;fV9$mWAEUx4KI}}Jv}`5x34hNZc+TrJ?pY`)yg*}e$q6E
z7$=;tzpnplcr{b@wW!x~CIzO`GFrkuf#K(wZUPj)*7e%m+JiVBIH(VOXBq}G)K|t<
zv4R4An3ZKMnEF`Hr(NqcV#<)33A@}^NAfg9PmF-X5+)}c^{yYLQ+wmhR0&4xmhX{P
z|Aw)7@+1*vwTXJA>+rs=?cwb>XS%BpJoeW^;9N6A)refe~|#rkU4_iy>Vytq!G-vhHf;@YFy7^1e=9==XU
zja|Kugcn<6u9z9gwG(LBVcCb#whIz`)6>gRz8x;BYaJ`$^Q5MQ2_>wDgdda>VJ8tr#|o<*&_C?TM1&ksBBOkt
zs7q-_{W!Tl>(Yc$;B8v>2d45hQnSTgu^XA%%v6PDUYZEsj@>Qp)!935&d(B$(4QmE
z^l&#zp}hBiA(
zu)D66zmUGsF(hYI9#V)=Zoa|J*}utu*QfMk8YxKMA0ME34GucE1M8nq7bSP>y1yt$
z4qsPe8$)yR-LpsBbRcd{nWZ@#Rx?q3eC5PD?NtfMXe@Vy^|B?o_=^H4=$m;T8dv0_
z{l0_2nelkE=fQ)I7cQ%O#Jj+k1w0)$KdP5SM1N0DN
zo3uT*t50x0LI-y`=>`9t`+P0u)llZ5B}VIgeP4~lz$`Re-M{5&n%7RMy2{bR-2Bmp
zua||Spx~C9x9TDG@ZwGAan~MSKKE9$)1`66K0$khjcI4CT2qHku!~SGpOga6@-j1pN}H#^Q`bFPv2>d=kncSk
z77qvSt^PL=l$wC$C(7&Z+Oxu$PH*%E@QOg?#cN_P
zseq{k)J>EI(+p^B{ni5n>o3H=2F{)z*d_=6o#=73Rxs}?~$=_`=MmRvMG
zxNPzbxGP00Xa?K{=pj)WJS6+|Q&R*Z{@-xE5dV^MfPdu=+WxWpFFBy`f9wF1F?0fI
zyn$oe6NNC~?pM9>5JM;0!V*i!SrVpbYyiEt8wNNn
zhsJIM+sdhV&fDF$nFd@xIQsD|2Bg^Fa!v
z)n9v4q}^BVjC48zuECQXEDm}D%ypxBCqSuW++VYq)tq{9(*y_}6g9EbuP9ss20GbI
z1|Esv8}RwgzpsK*Pnt&75@fzglD@>e25dp}Ex6DpAWzS=yVCJGT^
z(hWuiF>5i}0o}*cRlfN675o5LbAnYs5W<6Ehczo2DK(kfUaYAgk0q78F~Fv(hj?AQ
zJCO%weZ7{;dX_9yYOlX_LAC}C
zx@QzvX*9DTJ3sQ!41{vyym6nL^4)Z13dhPQkJf)p`@xCExwe(9m^@{y*P+n7m4lkv
z;-mR~cV@_0KGG2&YDZU{qx9A?5yoyJ4!R3
zIiOw6-8=2UH&xXP308RAbvUtj2j)nPGa=25i2UaI3GX+(ui-xjAr6JIDpjCbCy7Y)
z?R#4De(d|KQ?RAcnca;ePSFt|EisSFqwzzC37`+B?K31ii!hiUpjOL7Oy;JoK+gYa8iuoL
z&J}KRI_tmqs%om0n57z9>Ro%wrutQ(N8%yqVehGsVb6x3^ne$SJ?|w1Z}7T5b!y%x
z5bssWp0L_$KTq@H^)PkSda9S-GU1~e(>4z6ofBo$9+LyC?9p#z=O(wwm*U87EZ8jz
zh4MzhcI+i0+41^Z+X5_~D`-(~Xkyewx(+;B{!#YDMTCLr6bR2XhU!ak(6n1L>agkU
zoaqnrW7YQDeoKo9TH7xCSX2d*BaSBLKkabIbmy46Dtwq_rpOdNYk$+SGCiAt;asLX
zI-G3y^Sey8u}L$!r^qTSS1np)hAqXed)!h?vSecmOO$%|oxfmTwIlN{J*SiI{CiV1SW_aUNuXk8zl^lOInQkI)i
z*;Uc}+Z(xdM;-G6_z;p3);Y{ne_5jIz#UM^tBNiR$rml2_s_cvyLG4LL+x2-{yo~}
z*opIFRnyKeAd6s4aptSd-Jg7V^RfVDU@5X)PaDz0bBpDi?-@oVOHF&+fMeDK+E=Dt
zN1`Vy1#0aDr229a{jS~6b{*iReSX3A+62R4Zo74s@n{vh-QQ}kp|u|y>dy83F4l8Y
zzhFZm(~f^}<^6t5(I?I+wly1;2o@eh#Ve*q?25lV*NeZZW%8GRpCzo2r~=u{4_fuh
zR631Uue237b|DmBusRUGMy1#D(A+g7U`Tv#4_P!N5N6H`YQLZZKy0=|niBEC$ByS=W1Cl3R(
zj44U#GMpw(8~GiiXsD@*U-BCRN)C?6!s>%so-O86
zgJ?>Yz~w1j3}Pv0j6yAtg^Xrw0`xVaSd9Z~lRxgY?y8x_Yb`I{6b=a)D_zStN{(H;IU`YW0p*y*!f<_iLwv{XkYX2$s(d;96=X`-H;13vjsRnn0hKe;HUv~RP7ygb`{@jH>=lsq&&!*8gHPbD3
zzZF<5`;DXL3f$Re3(6r$N!)UwuY^>u}w2eF>v3uX34wOv#9T5<$4qNJjaK;KjHs%4mcUfi
z1*aV#f)Cz?#Y}fq?Bi6OMa`ZOhYH;?D6E|kuZXc<+(n$5Md7TJ#WXmF0OTWrtOLm2Go
zT|D3kHW3|swOeh!;HMG(Pwdv{J3S-7oSV!^@9@EpGbBz2ZaDJ7OoJ!M53X
zaKJ{~4$gAcTkL!$6pK(ezz-{6%Hn08c7NnwM
zcW2YceQ(+kWx+$VT^ljF=Zh6d1W{t16D@ni9U+FR7kkI#1qj}s3^Ozf%bI2?3z~(2
zo(s9ZO>IEzMcb=sFi#G^Xuq#cS=f4zdhb8@Lnjwq4Q_UZ@5~I7D*JJ31w`BGSs0RKjoLgY^V|9rS0L|z-`#|^n*|csafxM
z2F%4H?W4J$?k`|gM}prcE%B|%z^)$qf*l76C;ajZ9q$+Me
z?z2%+gJy_lZ+4Ov%_C0KP;J2qI@70^wTfnJ-{ZS6qy`fbv+_#ZcAM5b+{v1F=drj0
zB^ju_HyoHV;)s45JN22|#B46bFFfBb7@m!H79ktnVuEF9`J}MAt|b@u7&kyM^9o@PtVKg)3?bV&#UX=yg*k~BVUr3s;9Z}BFt!N^XZMfGxhxX3dTu7HRmcLNyu04kB
zWD0UAUK54yJ8|nKJgfpMpI1qa=Zzi@l(|Y`253XqN4ymK|!vC*e#Rgr76-EjLkA4bwyIq=`@ur9aj}B9xADxDSMfT
zDHs?%EhZ7zBLe}(UKZk!t?$niHG^M3`gwnr>nD5V`-H3w-+(8BSEn~v)|wOr*!t$o
zz@IjM?CeFM&y9A+;R{I*dk@u+$3IVVPJvFRvBRAXMtH`3oKVSk(UgVm|
zZb}?nGe!rU#g$^$AM_ZUfS%UEbou^F1c7-<@&Zg<(}0P^_Kf8U&HzO~@T!@sLeGEg83+MNtJW`(OKHZGHG_
zeOyxGXb*A$7CmWP^J~Uv6j_q@c(mqXYyTmZUgSbxGHu}EmO8K*cxw?HgAr`uY7bL~
z;g)alD_zNtGLf9evbC9DzC5SCC0&x2d8u8jLxo4^rep36cbQ#cXmx0z+A|wir4{4B
zBCD>1{TB{%E4wf$YNGAls5fVe4&3;@pnKn`%CuGO2p`mh?Czf~qsq<}ol{$JpIGom
zD3tUJ6dv7oDrO`yVqA3)p+K3)4GJ*_37wGj~IFW#&w
YOzWi69QwZXSr>J3aIr5xbnfbZ0WEGq1poj5

literal 0
HcmV?d00001

diff --git a/img/regexp-en.png b/img/regexp-en.png
new file mode 100644
index 0000000000000000000000000000000000000000..f2331491b387f1fd9cb7b843fe86893ca7fad475
GIT binary patch
literal 32144
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

literal 0
HcmV?d00001

diff --git a/img/regexp-es.png b/img/regexp-es.png
new file mode 100644
index 0000000000000000000000000000000000000000..3efa6eed322c852ffb7689b108d34aa0a844c76b
GIT binary patch
literal 34234
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ⅲOo}+zjETXvtEYZiOJMqI{EuGG!0^
z9;hWbp;Nf*`(+q)1C^44(yL$?W1AiM3;;0a7rGH*9VRBepaVBpeuEj|L+?#wZONme
z-RFZrquxo9IKg?8C@$_eAa(0~d_*&+Umf7@FB(ATo~Bei@`t&>OgCf+20Y*7?BemB
zGigUt9y`zK2m(d3@q?*pdxA2Gw(GoGQ=j?f=H`}#QJ0^Ti$0rJC2J^tr;a+#b;o`@
zja^axfM~_MXZBY4XV2CpZpg0S;PSAmqS6C7l93_{$_57~7O+y##-4<8mA#Lt#rDjr#8rK=PA3orqKn+Fr0ypml15ow?a^`io_EZTx1ra9*Vy)!ta_3bt3;*?RW>BRYI;dCejT)%00%cIeKBsfK9VddmV{PCT@;P1mt{
z3GUW9@|}c38qFDq~mR*HpX>ApJGPmMQA}kgTevkLJ!17I
zoQp*Shs66#JLgvI{;K~kY0E{SbVD!tumAl&1!Dih)SUkhY1;quZ*CYf%2SJ
R%nHS{Ni!$LjsN-g{{YNvA{YPw

literal 0
HcmV?d00001

diff --git a/img/regexp.svg b/img/regexp.svg
new file mode 100644
index 0000000..f08690b
--- /dev/null
+++ b/img/regexp.svg
@@ -0,0 +1,397 @@
+
+
+
+
+  regexp
+  
+  
+  
+    
+      
+        image/svg+xml
+        
+        regexp
+        https://github.com/zeeshanu/learn-regex
+        
+          
+            ponsfrilus
+          
+        
+        08.2017
+      
+    
+  
+  
+  
+    
+    
+    
+    
+    
+    
+  
+  
+    asdasda    
+      
+        
+          Start of the line
+          3 to 15 characters long
+          End of the line
+          Letters, numbers, underscores, hypens
+          ^[a-z0-9_-]{3,15]$
+        
+      
+    
+  
+  
+  
+

From 94e262611cd1935615ad6c33d9d88883b621cac2 Mon Sep 17 00:00:00 2001
From: yuhwan 
Date: Sun, 20 Aug 2017 01:05:40 +0900
Subject: [PATCH 22/36] Add Korean(ko) translation (#71)

* Create Korean ReadMe

* Add link to README-ko.md
---
 README-cn.md |   1 +
 README-es.md |   1 +
 README-fr.md |   1 +
 README-ja.md |   1 +
 README-ko.md | 410 +++++++++++++++++++++++++++++++++++++++++++++++++++
 README.md    |   1 +
 6 files changed, 415 insertions(+)
 create mode 100644 README-ko.md

diff --git a/README-cn.md b/README-cn.md
index 57b0b34..6f233a3 100644
--- a/README-cn.md
+++ b/README-cn.md
@@ -10,6 +10,7 @@
 * [Français](README-fr.md)
 * [中文版](README-cn.md)
 * [日本語](README-ja.md)
+* [한국어](README-ko.md)
 
 ## 什么是正则表达式?
 
diff --git a/README-es.md b/README-es.md
index 82ec6f6..52e82a4 100644
--- a/README-es.md
+++ b/README-es.md
@@ -10,6 +10,7 @@
 * [Français](README-fr.md)
 * [中文版](README-cn.md)
 * [日本語](README-ja.md)
+* [한국어](README-ko.md)
 
 ## What is Regular Expression?
 > 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 126ca62..115ab92 100644
--- a/README-fr.md
+++ b/README-fr.md
@@ -10,6 +10,7 @@
 * [Français](README-fr.md)
 * [中文版](README-cn.md)
 * [日本語](README-ja.md)
+* [한국어](README-ko.md)
 
 ## Qu'est-ce qu'une expression régulière?
 
diff --git a/README-ja.md b/README-ja.md
index 8fb870b..c77d970 100644
--- a/README-ja.md
+++ b/README-ja.md
@@ -10,6 +10,7 @@
 * [Français](README-fr.md)
 * [中文版](README-cn.md)
 * [日本語](README-ja.md)
+* [한국어](README-ko.md)
 
 ## 正規表現とは
 
diff --git a/README-ko.md b/README-ko.md
new file mode 100644
index 0000000..3030c43
--- /dev/null
+++ b/README-ko.md
@@ -0,0 +1,410 @@
+
+

+Learn Regex +


+ +## Translations: + +* [English](README.md) +* [Español](README-es.md) +* [Français](README-fr.md) +* [中文版](README-cn.md) +* [日本語](README-ja.md) +* [한국어](README-ko.md) + +## 정규표현식이란 무엇인가? + +> 정규표현식은 텍스트에서 특정 패턴을 찾아내는데 사용되는 문자 혹은 기호들의 집합이다. + +정규표현식(Regular expression)은 대상 문자열에 왼쪽에서 오른쪽 방향으로 매칭되는 하나의 패턴이다. "Regular expression"이라고 매번 발음하기 어렵기 때문에, 보통 약어로 "regex" 혹은 "regexp"로 축약되어 사용된다. 정규 표현식은 문자열 내부의 텍스트 대체, 포맷의 유효성 검사, 패턴 매칭을 기반으로한 문자열에서 일부 텍스트를 추출, 그리고 그 외에 다양한 목적을 위해 사용된다. + +당신이 하나의 어플리케이션을 작성하고 있고 사용자가 사용자명을 선택할 때 사용되는 규칙들을 정하고 싶다고 상상해보자. 예를 들어, 우리는 사용자명에 문자, 숫자, 밑줄 문자(\_), 그리고 하이픈이 포함되는것은 허용하고 싶다. 또한, 사용자명의 글자수를 제한해서 사용자명이 지저분해보이지 않도록 하고 싶다. 이때 아래 정규표현식을 사용해 입력된 사용자명이 해당 규칙에 맞는지 검사할 수 있다. + +

+

+ Regular expression +

+ +위의 정규 표현식은 `john_doe`, `jo-hn_doe`, 그리고 `john12_as` 문자열을 받아들일 수 있다. `Jo`는 대문자를 포함하고 있고 길이가 너무 짧기 때문에 위의 정규표현식과 매칭되지 않는다. + + +## 목차 + +- [기본 매쳐](#1-기본-매쳐) +- [메타 문자](#2-메타-문자) + - [마침표](#21-마침표) + - [문자 집합](#22-문자-집합) + - [부정 문자 집합](#221-부정-문자-집합) + - [반복](#23-반복) + - [별 부호](#231-별-부호) + - [덧셈 부호](#232-덧셈-부호) + - [물음표](#233-물음표) + - [중괄호](#24-중괄호) + - [문자 그룹](#25-문자-그룹) + - [대안 부호](#26-대안-부호) + - [특수 문자 이스케이핑](#27-특수-문자-이스케이핑) + - [앵커 부호](#28-앵커-부호) + - [캐럿 부호](#281-캐럿-부호) + - [달러 부호](#282-달러-부호) +- [단축형 문자열 집합](#3-단축형-문자열-집합) +- [룩어라운드](#4-룩어라운드) + - [긍정형 룩어헤드](#41-긍정형-룩어헤드) + - [부정형 룩어헤드](#42-부정형-룩어헤드) + - [긍정형 룩비하인드](#43-긍정형-룩비하인드) + - [부정형 룩비하인드](#44-부정형-룩비하인드) +- [플래그](#5-플래그) + - [대소문자 구분없음](#51-대소문자-구분없음) + - [전체 검색](#52-전체-검색) + - [멀티 라인](#53-멀티-라인) + +## 1. 기본 매쳐 + +하나의 정규 표현식은 단지 텍스트 내부의 검색을 수행하기 위한 문자열의 패턴이다. 예를 들어, 정규 표현식 `the`는 문자 `t` 다음에 문자 `h`, 그 다음에 문자 `e`가 나오는 것을 의미한다. + +
+"the" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/dmRygT/1) + +정규 표현식 `123`은 문자열 `123`에 매칭된다. 정규 표현식은 정규 표현식의 각 문자(Character)와 입력된 문자열의 각 문자(Character)를 비교함으로써 해당 문자열과 매칭된다. 정규 표현식들은 일반적으로 대소문자를 구분하기 때문에, 정규 표현식 `The`는 문자열 `the`와 매칭되지 않는다. + +
+"The" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/1paXsy/1) + +## 2. 메타 문자 + +메타 문자들은 정규 표현식의 빌딩 블락들이다. 메타 문자들은 자체적인 의미를 가지지 않고 특별한 방식으로 해석되어진다. 어떤 메타 문자열들은 특별한 의미를 가지며 대괄호안에서 쓰인다. +아래는 이러한 메타 문자열들이다: + +|메타 문자|설명| +|:----:|----| +|.|온점(Period)는 줄바꿈을 제외한 어떤 종류의 단일 문자와 매치.| +|[ ]|문자 클래스. 대괄호 사이에 있는 문자들로 매치.| +|[^ ]|부정 문자 클래스. 대괄호 안에 포함되지 않은 모든 문자들로 매치.| +|*|이 메타 문자의 바로 앞에 있는 심볼이 0번 이상 반복된 문자들과 매치.| +|+|이 메타 문자의 바로 앞에 있는 심볼이 한번 이상 반복된 문자들과 매치.| +|?|이 메타 문자의 바로 앞에 있는 심볼을 선택적(optional)으로 만듬.| +|{n,m}|중괄호. 이 메타 문자의 바로 앞에 위치한 심볼이 최소 n번 최대 m번의 반복된 문자들과 매치.| +|(xyz)|문자 그룹. 문자열 xyz와 정확히 같은 순서를 가진 문자들과 매치.| +|||대안. 문자가 이 메타 문자의 앞에 있는 심볼이거나 뒤에 있는 심볼이면 매치.| +|\|다음 문자 이스케이프(Escape). 예약된 문자열들 [ ] ( ) { } . * + ? ^ $ \ |을 이스케이핑함으로써 그 자체와 매칭되는 것을 허용.| +|^|입력의 시작과 매치.| +|$|입력의 끝과 매치.| + +## 2.1 마침표 + +마침표(`.`)는 메타 문자의 가장 간단한 예다. 메타 문자 `.`는 어떠한 단일 문자와도 매치되지만 리턴 혹은 개행 문자와는 매치되지 않는다. 예를 들어, 정규 표현식 `.ar`은 어떠한 단일 문자 다음에 문자 `a`가 오고, 그 다음에 문자 `r`이 오는 패턴을 의미한다. + +
+".ar" => The car parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/xc9GkU/1) + +## 2.2 문자 집합 + +문자 집합은 문자 클래스라고도 불린다. 대괄호는 이 문자 집합을 명시하기 위해 사용된다. 문자열 집합내에 사용된 하이픈은 문자들의 범위를 지정하는데 사용된다. 대괄호 내부에 명시된 문자들의 순서는 중요하지 않다. 예를 들어, 정규 표현식 `[Tt]he`는 대문자 `T` 혹은 소문자 `t`가 나온 다음에, 문자 `h`가 나오고 그 뒤에 문자 `e`가 나오는 패턴을 의미한다. + +
+"[Tt]he" => The car parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/2ITLQ4/1) + +하지만, 문자 집합 내부에서 사용되는 온점(Period)은 온점 그 자체를 의미한다. 정규 표현식 `ar[.]`은 소문자 `a` 다음에 문자 `r`이 오고 그 뒤에 문자 `.`이 오는 패턴을 의미한다. + +
+"ar[.]" => A garage is a good place to park a car.
+
+ +[Test the regular expression](https://regex101.com/r/wL3xtE/1) + +### 2.2.1 부정 문자 집합 + +일반적으로, 캐럿 기호(^)는 문자열의 시작지점을 나타내지만, 왼쪽 대괄호 바로 뒤에 위치했을때는 해당 문자 집합의 부정(negation)을 나타낸다. 예를 들어, 정규 표현식 `[^c]ar`은 문자 `c`를 제외한 어떠한 문자뒤에 문자 `a`가 오고, 그 뒤에 문자 `r`이 오는 패턴을 의미한다. + +
+"[^c]ar" => The car parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/nNNlq3/1) + +## 2.3 반복 + +메타 문자 `+`, `*` 또는 `?`은 하위패턴(subpattern)이 몇 번 발생하는지 지정하는데 사용된다. 이러한 메타 문자들은 상황에따라 다르게 동작한다. + +### 2.3.1 별 부호 + +`*` 부호는 부호 앞에 위치한 매처(matcher)가 0번 이상 반복된 문자열과 매치된다. 정규 표현식 `a*`은 소문자 `a`가 0번 이상 반복되는 패턴을 의미한다. 하지만, 만약 이 별 부호가 문자 집합(character set) 직후에 나오는 경우에는 문자 집합 전체의 반복을 찾게된다. 예를 들어, 정규 표현식 `[a-z]*`은 소문자들이 갯수와 상관없이 연속으로 반복되는 패턴을 의미한다. + +
+"[a-z]*" => The car parked in the garage #21.
+
+ +[Test the regular expression](https://regex101.com/r/7m8me5/1) + +`*` 부호는 메타 문자 `.`와 함께 모든 문자열과 매치되는 패턴을 만드는데 사용될 수 있다. 또한, `*` 부호는 공백 문자 `\s`와 함께 공백 문자들로 이루어진 문자열과 매치되는 패턴을 만드는데 사용될 수 있다. 예를 들어, 정규 표현식 `\s*cat\s*`는 0번 이상 공백문자가 나온 이후에 소문자 `c`, 소문자 `a`, 소문자 `t`가 자체로 나오고 그 뒤에 다시 0번 이상의 공백문자가 나오는 패턴을 의미한다. + +
+"\s*cat\s*" => The fat cat sat on the concatenation.
+
+ +[Test the regular expression](https://regex101.com/r/gGrwuz/1) + +### 2.3.2 덧셈 부호 + +`+` 부호는 부호 앞에 위치한 문자가 한번 이상 반복되는 패턴을 만드는데 사용된다. 예를 들어, 정규 표현식 `c.+t`는 소문자 `c`가 나오고, 그 뒤에 한개 이상의 문자가 나온 후, 소문자 `t`가 나오는 패턴을 의미한다. 여기서 문자 `t`는 해당 문장의 제일 마지막 글자 `t`라는것을 명확히할 필요가 있다. + w +
+"c.+t" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/Dzf9Aa/1) + +### 2.3.3 물음표 + +정규 표현식에서 메타 문자 `?`는 선행 문자를 선택적으로 만드는 역할을 한다. 물음표는 부호 앞에 쓰여진 문자가 선택적으로 나오는 패턴을 나타내는데 사용된다. 예를 들어, 정규 표현식 `[T]?he`는 대문자 `T`가 선택적으로 나온 이후에, 그 뒤에 소문자 `h`, 그 뒤에 소문자 `e`가 나오는 패턴을 의미한다. + +
+"[T]he" => The car is parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/cIg9zm/1) + +
+"[T]?he" => The car is parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/kPpO2x/1) + +## 2.4 중괄호 + +정규 표현식에서 정량자(quantifier)라고도 불리는 중괄호는 하나의 문자 혹은 문자 집합으로 표시된 문자가 몇번 반복되는지 명시하는데 사용된다. 예를 들어, 정규 표현식 `[0-9]{2,3}`은 숫자 문자(0부터 9사이의 문자)가 최소 2번, 최대 3번 연속해서 나오는 문자열 패턴을 의미한다. + +
+"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
+
+ +[Test the regular expression](https://regex101.com/r/juM86s/1) + +두번째 숫자를 생략하는것이 가능하다. 예를 들어, 정규 표현식 `[0-9]{2,}`는 2번 이상의 숫자가 연속으로 나오는 패턴을 의미한다. 만약 여기서 쉼표를 삭제하는 경우, 정규 표현식 `[0-9]{3}`은 숫자가 정확히 3번 연속해서 나오는 패턴을 의미한다. + +
+"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
+
+ +[Test the regular expression](https://regex101.com/r/Gdy4w5/1) + +
+"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.
+
+ +[Test the regular expression](https://regex101.com/r/Sivu30/1) + +## 2.5 문자 그룹 + +문자 그룹은 괄호 `(...)` 안에 쓰여진 하위 패턴들의 그룹이다. 위에서 논의했듯이, 정규 표현식에서 하나의 문자뒤에 정량자(quantifier)를 넣는 경우에는 해당 문자의 반복을 나타낸다. 하지만, 만약 하나의 문자 그룹뒤에 정량자를 넣는 경우에는 문자 그룹 전체의 반복을 나타내게 된다. 예를 들어, 정규 표현식 `(ab)*`는 문자 "ab"가 0번 이상 반복되는 패턴을 의미한다. 대안 부호인 `|` 또한 문자 그룹 내부에서 사용할 수 있다. 예를 들어, 정규 표현식 `(c|g|p)ar`은 소문자 `c`, `g` 혹은 `p`가 나온 이후에 문자 `a`가 나오고 그 뒤에 문자 `r`이 나오는 패턴을 의미한다. + +
+"(c|g|p)ar" => The car is parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/tUxrBG/1) + +## 2.6 대안 부호 + +정규 표현식에서 수직 막대 부호 `|`는 대안을 정의하는데 사용된다. 대안 부호는 여러개의 표현식들 사이의 조건과도 같다. 지금쯤 당신은 문자 집합 (Character set)과 대안 부호가 동일하게 동작한다고 생각하고 있을 것이다. 하지만, 문자 집합과 대안 부호 사이의 가장 큰 차이점은 문자 집합은 문자 수준에서 동작하는 반면, 대안 부호는 표현식 수준에서 동작한다는 것이다. 예를 들어, 정규 표현식 `(T|t)he|car`는 대문자 `T` 혹은 소문자 `t`가 나오고 문자 `h`, 문자 `e`가 차례로 나오거나 문자 `c`, 문자 `a`, 문자 `r`이 차례로 나오는 패턴을 의미한다. + +
+"(T|t)he|car" => The car is parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/fBXyX0/1) + +## 2.7 특수 문자 이스케이핑 + +백 슬래시 `\`는 정규 표현식에서 다음에 나오는 부호를 이스케이핑하는데 사용된다. 백 슬래시는 예약 문자들인 `{ } [ ] / \ + * . $ ^ | ?`를 메타 부호가 아닌 문자 그 자체로 매칭되도록 명시한다. 특수 문자를 매칭 캐릭터로 사용하기 위해서는 백 슬래시 `\`를 해당 특수 문자 앞에 붙이면 된다. 예를 들어, 정규 표현식 `.`은 개행을 제외한 어떤 문자와 매칭된다. 입력 문자열에 포함된 `.` 문자를 매치시키는 정규 표현식 `(f|c|m)at\.?`은 소문자 `f`, `c` 또는 `m` 이후에 소문자 `a`와 `t`가 차례로 등장하고 이후에 문자 `.`가 선택적으로 나타나는 패턴을 의미한다. + +
+"(f|c|m)at\.?" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/DOc5Nu/1) + +## 2.8 앵커 부호 + +정규 표현식에서 앵커는 매칭 문자가 표현식의 시작 문자인지 혹은 끝 문자인지 명시하는데 사용된다. 앵커는 두가지 종류가 있다: 첫번째 종류인 캐럿 부호 `^`는 매칭 문자가 입력 문자열의 첫 시작 문자인지 나타내는데 사용되며 두번째 종류인 달러 부호 `$`는 해당 매칭 문자가 입력 문자의 마지막 문자라는 것을 명시하는데 사용된다. + +### 2.8.1 캐럿 부호 + +캐럿 부호 `^`는 매칭 문자가 표현식의 시작이라는 것을 명시하는데 사용된다. 만약 (a가 시작 문자인지 확인하는) 정규 표현식 `^a`를 입력 문자열 `abc`에 적용하면, 이 정규 표현식은 `a`를 매칭 결과값으로 내보낸다. 반면, 정규 표현식 `^b`를 위의 입력 문자열에 적용하면, 아무런 매칭도 이러나지 않는다. 왜냐하면 입력 문자열 `abc`에서 "b"는 처음 시작 문자가 아니기 때문이다. 또 다른 정규 표현식인 `^(T|t)he`를 살펴보자. 이 정규 표현식은 대문자 `T` 또는 소문자 `t`가 입력 문자열의 시작으로 나오고, 그 뒤에 문자 `h`와 문자 `e`가 차례로 나오는 패턴을 의미한다. + +
+"(T|t)he" => The car is parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/5ljjgB/1) + +
+"^(T|t)he" => The car is parked in the garage.
+
+ +[Test the regular expression](https://regex101.com/r/jXrKne/1) + +### 2.8.2 달러 부호 + +달러 부호 `$`는 입력 문자열의 마지막 문자가 매칭 문자로 끝나는지 확인하는데 사용된다. 예를 들어, 정규 표현식 `(at\.)$`는 소문자 `a`와 `t` 그리고 문자 `.`가 순서대로 입력 문자열의 맨 마지막에 나오는지 확인하는 패턴을 의미한다. + +
+"(at\.)" => The fat cat. sat. on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/y4Au4D/1) + +
+"(at\.)$" => The fat cat. sat. on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/t0AkOd/1) + +## 3. 단축형 문자열 집합 + +정규 표현식은 일반적으로 사용되는 문자열 집합들을 간편하게 사용할 수 있도록 여러 단축형들을 제공한다. 단축형 문자열 집합은 아래와 같다. + +|단축형|설명| +|:----:|----| +|.|개행을 제외한 모든 문자| +|\w|영숫자 문자와 매치: `[a-zA-Z0-9_]`| +|\W|영숫자 문자가 아닌 문자와 매치: `[^\w]`| +|\d|숫자와 매치: `[0-9]`| +|\D|숫자가 아닌 문자와 매치: `[^\d]`| +|\s|공백 문자와 매치: `[\t\n\f\r\p{Z}]`| +|\S|공백 문자가 아닌 문자와 매치: `[^\s]`| + +## 4. 룩어라운드 + +때때로 룩어라운드라고 알려진 룩비하인드와 룩어헤드는 (패턴 매칭을 위해서 사용되지만 매칭된 리스트에는 포함되지 않는) ***넌-캡쳐링 그룹*** 의 특정 종류들이다. 룩어라운드는 하나의 패턴이 다른 특정 패턴 전이나 후에 나타나는 조건을 가지고 있을때 사용한다. 예를 들어, 우리가 입력 문자열 `$4.44 and $10.88`에 대해서 달러 부호 `$`이후에 나오는 모든 숫자를 매칭시키고 싶다고 하자. 이때 정규 표현식 `(?<=\$0[0-9\.]*`를 사용할 수 있다. 이 정규 표현식은 `$` 문자 뒤에 나오는 문자 `.`을 포함한 모든 숫자 문자를 의미한다. 다음은 정규 표현식에서 사용되는 룩어라운드들이다. + +|부호|설명| +|:----:|----| +|?=|긍정형 룩어헤드| +|?!|부정형 룩어헤드| +|?<=|긍정형 룩비하인드| +|? +"[T|t]he(?=\sfat)" => The fat cat sat on the mat. +
+ +[Test the regular expression](https://regex101.com/r/IDDARt/1) + +### 4.2 부정형 룩어헤드 + +부정형 룩어헤드는 입력 문자열로부터 특정 패턴이 뒤에 나오지 않기를 바라는 상황에서 사용된다. 부정형 룩어헤드는 우리가 긍정형 룩어헤드를 정의하는 방식과 동일하게 정의된다. 하지만, 유일한 차이점은 등호 부호 `=` 대신 부정 부호 `!` 문자를 사용한다는 것이다, 즉 `(?!...)`. 정규 표현식 `[T|t]he(?!\sfat)`를 살펴보도록 하자. 이 정규 표현식은 공백 문자와 `fat` 문자열이 연속으로 나오지 않는 모든 `The` 혹은 `the` 문자열과 매치된다. + +
+"[T|t]he(?!\sfat)" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/V32Npg/1) + +### 4.3 긍정형 룩비하인드 + +긍정형 룩비하인드는 특정 패턴뒤에 나오는 문자열 매치를 가져오기 위해서 사용된다. 긍정형 룩비하인드는 `(?<=...)`로 표시된다. 예를 들어, 정규 표현식 `(?<=[T|t]he\s)(fat|mat)`는 입력 문자열에서 `The` 혹은 `the` 뒤에 공백이 나오고, 그 뒤에 `fat` 또는 `mat`이 나오는 패턴을 의미한다. + +
+"(?<=[T|t]he\s)(fat|mat)" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/avH165/1) + +### 4.4 부정형 룩비하인드 + +부정형 룩비하인드는 특정 패턴이 뒤에 나오지 않기를 바라는 상황에서 사용된다. 부정형 룩비하인드는 `(? +"(?<![T|t]he\s)(cat)" => The cat sat on cat. +
+ +[Test the regular expression](https://regex101.com/r/8Efx5G/1) + +## 5. 플래그 + +플래그는 정규표현식의 출력값을 수정하기 때문에 수정자(modifier)라고도 불린다. 이러한 플래그들은 어떤 순서 혹은 조합으로 사용가능하며 정규 표현식의 일부분이다. + +|플래그|설명| +|:----:|----| +|i|대소문자 구분없음: 매칭이 대소문자를 구분하지 않도록 설정.| +|g|전체 검색: 입력 문자열 전체를 대상으로 패턴을 검색.| +|m|멀티 라인: 앵터 메타 문자가 각 줄마다 동작하도록 설정.| + +### 5.1 대소문자 구분없음 + +수정자 `i`는 대소문자 구분없는 매칭을 수행하는데 사용된다. 예를 들어, 정규 표현식 `/The/gi`는 대문자 `T`, 소문자 `h`, 소문자 `e`가 차례로 나오는 패턴을 의미한다. 여기서 정규 표현식 마지막에 있는 `i` 플래그가 정규 표현식 엔진에게 대소문자를 구분하지 않도록 알려준다. `g` 플래그는 전체 입력 문자열내부에서 패턴을 검색하기 위해 설정되었다. + +
+"The" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/dpQyf9/1) + +
+"/The/gi" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/ahfiuh/1) + +### 5.2 전체 검색 + +수정자 `g`는 첫번째 매칭후에 멈추지 않고 계속해서 모든 매칭을 검색하는 전체 검색을 수행하는데 사용된다. 예를 들어, 정규 표현식 `/.(at)/g`는 개행을 제회한 문자가 나오고, 그 뒤에 소문자 `a`, 소문자 `t`가 나오는 패턴을 의미한다. 여기에서 `g` 플래그를 정규 표현식의 마지막에 설정했기 때문에, 이 패턴은 입력 문자열 전체에서 나타나는 모든 패턴을 찾아낸다. + +
+"/.(at)/" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/jnk6gM/1) + +
+"/.(at)/g" => The fat cat sat on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/dO1nef/1) + +### 5.3 멀티 라인 + +수정자 `m`은 멀티 라인 매치를 수행하는데 사용된다. 이전에 이야기 했던 것처럼, 앵커 `(^, $)`는 패턴의 시작과 끝을 확인하는데 사용된다. 하지만 만약 우리가 각 라인마다 이 앵커가 동작하게하고 싶으면 `m` 플래그를 설정하면된다. 예를 들어, 정규 표현식 `/at(.)?$/gm`은 소문자 `a`와 소문자 `t`가 차례로 나오고, 선택적으로 개행을 제외한 문자가 나오는 패턴을 의미한다. 여기서 플래그 `m`으로 인해서 정규 표현식 엔진은 입력 문자열의 각 라인에 대해서 해당 패턴을 매칭하게 된다. + +
+"/.at(.)?$/" => The fat
+                cat sat
+                on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/hoGMkP/1) + +
+"/.at(.)?$/gm" => The fat
+                  cat sat
+                  on the mat.
+
+ +[Test the regular expression](https://regex101.com/r/E88WE2/1) + +## 기여 방법 + +* 이슈 리포팅 +* 코드 개선해서 풀 리퀘스트 열기 +* 소문내기 +* ziishaned@gmail.com 메일로 직접 연락하기 또는 [![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/ziishaned.svg?style=social&label=Follow%20%40ziishaned)](https://twitter.com/ziishaned) + +## 라이센스 + +MIT © [Zeeshan Ahmed](mailto:ziishaned@gmail.com) diff --git a/README.md b/README.md index 823ce08..d1d958d 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ * [Français](README-fr.md) * [中文版](README-cn.md) * [日本語](README-ja.md) +* [한국어](README-ko.md) ## What is Regular Expression? From 9265b137340134fbb33b6442d2deedc3e42c44f9 Mon Sep 17 00:00:00 2001 From: "yeongjun.kim" Date: Sun, 20 Aug 2017 22:52:56 +0900 Subject: [PATCH 23/36] Update "5. lookaround" in README-ko.md (#74) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update "5. lookaround" in README-ko.md - 전방탐색, 후방탐색 단어 변경 * Update README-ko.md --- README-ko.md | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/README-ko.md b/README-ko.md index 3030c43..faf03b3 100644 --- a/README-ko.md +++ b/README-ko.md @@ -16,7 +16,7 @@ > 정규표현식은 텍스트에서 특정 패턴을 찾아내는데 사용되는 문자 혹은 기호들의 집합이다. -정규표현식(Regular expression)은 대상 문자열에 왼쪽에서 오른쪽 방향으로 매칭되는 하나의 패턴이다. "Regular expression"이라고 매번 발음하기 어렵기 때문에, 보통 약어로 "regex" 혹은 "regexp"로 축약되어 사용된다. 정규 표현식은 문자열 내부의 텍스트 대체, 포맷의 유효성 검사, 패턴 매칭을 기반으로한 문자열에서 일부 텍스트를 추출, 그리고 그 외에 다양한 목적을 위해 사용된다. +정규표현식(Regular expression)은 대상 문자열에 왼쪽에서 오른쪽 방향으로 매칭되는 하나의 패턴이다. "Regular expression"이라고 매번 발음하기 어렵기 때문에, 보통 약어로 "regex" 혹은 "regexp", "정규식"로 축약되어 사용된다. 정규 표현식은 문자열 내부의 텍스트 대체, 포맷의 유효성 검사, 패턴 매칭을 기반으로한 문자열에서 일부 텍스트를 추출, 그리고 그 외에 다양한 목적을 위해 사용된다. 당신이 하나의 어플리케이션을 작성하고 있고 사용자가 사용자명을 선택할 때 사용되는 규칙들을 정하고 싶다고 상상해보자. 예를 들어, 우리는 사용자명에 문자, 숫자, 밑줄 문자(\_), 그리고 하이픈이 포함되는것은 허용하고 싶다. 또한, 사용자명의 글자수를 제한해서 사용자명이 지저분해보이지 않도록 하고 싶다. 이때 아래 정규표현식을 사용해 입력된 사용자명이 해당 규칙에 맞는지 검사할 수 있다. @@ -47,11 +47,11 @@ - [캐럿 부호](#281-캐럿-부호) - [달러 부호](#282-달러-부호) - [단축형 문자열 집합](#3-단축형-문자열-집합) -- [룩어라운드](#4-룩어라운드) - - [긍정형 룩어헤드](#41-긍정형-룩어헤드) - - [부정형 룩어헤드](#42-부정형-룩어헤드) - - [긍정형 룩비하인드](#43-긍정형-룩비하인드) - - [부정형 룩비하인드](#44-부정형-룩비하인드) +- [전후방탐색](#4-전후방탐색) +  - [긍정형 전방탐색](#41-긍정형-전방탐색) +  - [부정형 전방탐색](#42-부정형-전방탐색) +  - [긍정형 후방탐색](#43-긍정형-후방탐색) +  - [부정형 후방탐색](#44-부정형-후방탐색) - [플래그](#5-플래그) - [대소문자 구분없음](#51-대소문자-구분없음) - [전체 검색](#52-전체-검색) @@ -285,20 +285,20 @@ |\s|공백 문자와 매치: `[\t\n\f\r\p{Z}]`| |\S|공백 문자가 아닌 문자와 매치: `[^\s]`| -## 4. 룩어라운드 +## 4. 전후방탐색 -때때로 룩어라운드라고 알려진 룩비하인드와 룩어헤드는 (패턴 매칭을 위해서 사용되지만 매칭된 리스트에는 포함되지 않는) ***넌-캡쳐링 그룹*** 의 특정 종류들이다. 룩어라운드는 하나의 패턴이 다른 특정 패턴 전이나 후에 나타나는 조건을 가지고 있을때 사용한다. 예를 들어, 우리가 입력 문자열 `$4.44 and $10.88`에 대해서 달러 부호 `$`이후에 나오는 모든 숫자를 매칭시키고 싶다고 하자. 이때 정규 표현식 `(?<=\$0[0-9\.]*`를 사용할 수 있다. 이 정규 표현식은 `$` 문자 뒤에 나오는 문자 `.`을 포함한 모든 숫자 문자를 의미한다. 다음은 정규 표현식에서 사용되는 룩어라운드들이다. +때때로 전후방탐색(Lookaround)이라고 알려진 후방탐색(Lookbehind)과 전방탐색(Lookahead)은 (패턴 매칭을 위해서 사용되지만 매칭된 리스트에는 포함되지 않는) ***넌-캡쳐링 그룹*** 의 특정 종류들이다. 룩어라운드는 하나의 패턴이 다른 특정 패턴 전이나 후에 나타나는 조건을 가지고 있을때 사용한다. 예를 들어, 우리가 입력 문자열 `$4.44 and $10.88`에 대해서 달러 부호 `$`이후에 나오는 모든 숫자를 매칭시키고 싶다고 하자. 이때 정규 표현식 `(?<=\$0[0-9\.]*`를 사용할 수 있다. 이 정규 표현식은 `$` 문자 뒤에 나오는 문자 `.`을 포함한 모든 숫자 문자를 의미한다. 다음은 정규 표현식에서 사용되는 룩어라운드들이다. |부호|설명| |:----:|----| -|?=|긍정형 룩어헤드| -|?!|부정형 룩어헤드| -|?<=|긍정형 룩비하인드| -|? "[T|t]he(?=\sfat)" => The fat cat sat on the mat. @@ -306,9 +306,9 @@ [Test the regular expression](https://regex101.com/r/IDDARt/1) -### 4.2 부정형 룩어헤드 +### 4.2 부정형 전방탐색 -부정형 룩어헤드는 입력 문자열로부터 특정 패턴이 뒤에 나오지 않기를 바라는 상황에서 사용된다. 부정형 룩어헤드는 우리가 긍정형 룩어헤드를 정의하는 방식과 동일하게 정의된다. 하지만, 유일한 차이점은 등호 부호 `=` 대신 부정 부호 `!` 문자를 사용한다는 것이다, 즉 `(?!...)`. 정규 표현식 `[T|t]he(?!\sfat)`를 살펴보도록 하자. 이 정규 표현식은 공백 문자와 `fat` 문자열이 연속으로 나오지 않는 모든 `The` 혹은 `the` 문자열과 매치된다. +부정형 전방탐색는 입력 문자열로부터 특정 패턴이 뒤에 나오지 않기를 바라는 상황에서 사용된다. 부정형 전방탐색는 우리가 긍정형 전방탐색를 정의하는 방식과 동일하게 정의된다. 하지만, 유일한 차이점은 등호 부호 `=` 대신 부정 부호 `!` 문자를 사용한다는 것이다, 즉 `(?!...)`. 정규 표현식 `[T|t]he(?!\sfat)`를 살펴보도록 하자. 이 정규 표현식은 공백 문자와 `fat` 문자열이 연속으로 나오지 않는 모든 `The` 혹은 `the` 문자열과 매치된다.
 "[T|t]he(?!\sfat)" => The fat cat sat on the mat.
@@ -316,9 +316,9 @@
 
 [Test the regular expression](https://regex101.com/r/V32Npg/1)
 
-### 4.3 긍정형 룩비하인드
+### 4.3 긍정형 후방탐색
 
-긍정형 룩비하인드는 특정 패턴뒤에 나오는 문자열 매치를 가져오기 위해서 사용된다. 긍정형 룩비하인드는 `(?<=...)`로 표시된다. 예를 들어, 정규 표현식 `(?<=[T|t]he\s)(fat|mat)`는 입력 문자열에서 `The` 혹은 `the` 뒤에 공백이 나오고, 그 뒤에 `fat` 또는 `mat`이 나오는 패턴을 의미한다. 
+긍정형 후방탐색는 특정 패턴뒤에 나오는 문자열 매치를 가져오기 위해서 사용된다. 긍정형 후방탐색는 `(?<=...)`로 표시된다. 예를 들어, 정규 표현식 `(?<=[T|t]he\s)(fat|mat)`는 입력 문자열에서 `The` 혹은 `the` 뒤에 공백이 나오고, 그 뒤에 `fat` 또는 `mat`이 나오는 패턴을 의미한다. 
 
 
 "(?<=[T|t]he\s)(fat|mat)" => The fat cat sat on the mat.
@@ -326,9 +326,9 @@
 
 [Test the regular expression](https://regex101.com/r/avH165/1)
 
-### 4.4 부정형 룩비하인드
+### 4.4 부정형 후방탐색
 
-부정형 룩비하인드는 특정 패턴이 뒤에 나오지 않기를 바라는 상황에서 사용된다. 부정형 룩비하인드는 `(?
 "(?<![T|t]he\s)(cat)" => The cat sat on cat.

From 4b95975c4cf5f8eef67f11dc305cb9a2eb599c97 Mon Sep 17 00:00:00 2001
From: "yeongjun.kim" 
Date: Mon, 21 Aug 2017 01:05:53 +0900
Subject: [PATCH 24/36] Update README-ko.md (#75)

- modify spelling
---
 README-ko.md | 34 +++++++++++++++++-----------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/README-ko.md b/README-ko.md
index faf03b3..0a5e284 100644
--- a/README-ko.md
+++ b/README-ko.md
@@ -16,7 +16,7 @@
 
 > 정규표현식은 텍스트에서 특정 패턴을 찾아내는데 사용되는 문자 혹은 기호들의 집합이다.
 
-정규표현식(Regular expression)은 대상 문자열에 왼쪽에서 오른쪽 방향으로 매칭되는 하나의 패턴이다. "Regular expression"이라고 매번 발음하기 어렵기 때문에, 보통 약어로 "regex" 혹은 "regexp", "정규식"로 축약되어 사용된다. 정규 표현식은 문자열 내부의 텍스트 대체, 포맷의 유효성 검사, 패턴 매칭을 기반으로한 문자열에서 일부 텍스트를 추출, 그리고 그 외에 다양한 목적을 위해 사용된다.
+정규표현식(Regular expression)은 대상 문자열에 왼쪽에서 오른쪽 방향으로 매칭되는 하나의 패턴이다. "Regular expression"이라고 매번 발음하기 어렵기 때문에, 보통 약어로 "regex" 혹은 "regexp", "정규식"으로 축약되어 사용된다. 정규 표현식은 문자열 내부의 텍스트 대체, 포맷의 유효성 검사, 패턴 매칭을 기반으로한 문자열에서 일부 텍스트를 추출, 그리고 그 외에 다양한 목적을 위해 사용된다.
 
 당신이 하나의 어플리케이션을 작성하고 있고 사용자가 사용자명을 선택할 때 사용되는 규칙들을 정하고 싶다고 상상해보자. 예를 들어, 우리는 사용자명에 문자, 숫자, 밑줄 문자(\_), 그리고 하이픈이 포함되는것은 허용하고 싶다. 또한, 사용자명의 글자수를 제한해서 사용자명이 지저분해보이지 않도록 하고 싶다. 이때 아래 정규표현식을 사용해 입력된 사용자명이 해당 규칙에 맞는지 검사할 수 있다.
 
@@ -48,10 +48,10 @@
     - [달러 부호](#282-달러-부호)
 - [단축형 문자열 집합](#3-단축형-문자열-집합)
 - [전후방탐색](#4-전후방탐색)
-  - [긍정형 전방탐색](#41-긍정형-전방탐색)
-  - [부정형 전방탐색](#42-부정형-전방탐색)
-  - [긍정형 후방탐색](#43-긍정형-후방탐색)
-  - [부정형 후방탐색](#44-부정형-후방탐색)
+  - [긍정형 전방탐색](#41-긍정형-전방탐색)
+  - [부정형 전방탐색](#42-부정형-전방탐색)
+  - [긍정형 후방탐색](#43-긍정형-후방탐색)
+  - [부정형 후방탐색](#44-부정형-후방탐색)
 - [플래그](#5-플래그)
   - [대소문자 구분없음](#51-대소문자-구분없음)
   - [전체 검색](#52-전체-검색)
@@ -135,7 +135,7 @@
 
 ## 2.3 반복
 
-메타 문자 `+`, `*` 또는 `?`은 하위패턴(subpattern)이 몇 번 발생하는지 지정하는데 사용된다. 이러한 메타 문자들은 상황에따라 다르게 동작한다.
+메타 문자 `+`, `*` 또는 `?`은 하위패턴(subpattern)이 몇 번 발생하는지 지정하는데 사용된다. 이러한 메타 문자들은 상황에 따라 다르게 동작한다.
 
 ### 2.3.1 별 부호
 
@@ -183,7 +183,7 @@
 
 ## 2.4 중괄호
 
-정규 표현식에서 정량자(quantifier)라고도 불리는 중괄호는 하나의 문자 혹은 문자 집합으로 표시된 문자가 몇번 반복되는지 명시하는데 사용된다. 예를 들어, 정규 표현식 `[0-9]{2,3}`은 숫자 문자(0부터 9사이의 문자)가 최소 2번, 최대 3번 연속해서 나오는 문자열 패턴을 의미한다. 
+정규 표현식에서 정량자(quantifier)라고도 불리는 중괄호는 하나의 문자 혹은 문자 집합으로 표시된 문자가 몇번 반복되는지 명시하는데 사용된다. 예를 들어, 정규 표현식 `[0-9]{2,3}`은 숫자 문자(0부터 9사이의 문자)가 최소 2번, 최대 3번 연속해서 나오는 문자열 패턴을 의미한다.
 
 
 "[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
@@ -207,7 +207,7 @@
 
 ## 2.5 문자 그룹
 
-문자 그룹은 괄호 `(...)` 안에 쓰여진 하위 패턴들의 그룹이다. 위에서 논의했듯이, 정규 표현식에서 하나의 문자뒤에 정량자(quantifier)를 넣는 경우에는 해당 문자의 반복을 나타낸다. 하지만, 만약 하나의 문자 그룹뒤에 정량자를 넣는 경우에는 문자 그룹 전체의 반복을 나타내게 된다. 예를 들어, 정규 표현식 `(ab)*`는 문자 "ab"가 0번 이상 반복되는 패턴을 의미한다. 대안 부호인 `|` 또한 문자 그룹 내부에서 사용할 수 있다. 예를 들어, 정규 표현식 `(c|g|p)ar`은 소문자 `c`, `g` 혹은 `p`가 나온 이후에 문자 `a`가 나오고 그 뒤에 문자 `r`이 나오는 패턴을 의미한다. 
+문자 그룹은 괄호 `(...)` 안에 쓰여진 하위 패턴들의 그룹이다. 위에서 논의했듯이, 정규 표현식에서 하나의 문자뒤에 정량자(quantifier)를 넣는 경우에는 해당 문자의 반복을 나타낸다. 하지만, 만약 하나의 문자 그룹뒤에 정량자를 넣는 경우에는 문자 그룹 전체의 반복을 나타내게 된다. 예를 들어, 정규 표현식 `(ab)*`는 문자 "ab"가 0번 이상 반복되는 패턴을 의미한다. 대안 부호인 `|` 또한 문자 그룹 내부에서 사용할 수 있다. 예를 들어, 정규 표현식 `(c|g|p)ar`은 소문자 `c`, `g` 혹은 `p`가 나온 이후에 문자 `a`가 나오고 그 뒤에 문자 `r`이 나오는 패턴을 의미한다.
 
 
 "(c|g|p)ar" => The car is parked in the garage.
@@ -217,7 +217,7 @@
 
 ## 2.6 대안 부호
 
-정규 표현식에서 수직 막대 부호 `|`는 대안을 정의하는데 사용된다. 대안 부호는 여러개의 표현식들 사이의 조건과도 같다. 지금쯤 당신은 문자 집합 (Character set)과 대안 부호가 동일하게 동작한다고 생각하고 있을 것이다. 하지만, 문자 집합과 대안 부호 사이의 가장 큰 차이점은 문자 집합은 문자 수준에서 동작하는 반면, 대안 부호는 표현식 수준에서 동작한다는 것이다. 예를 들어, 정규 표현식 `(T|t)he|car`는 대문자 `T` 혹은 소문자 `t`가 나오고 문자 `h`, 문자 `e`가 차례로 나오거나 문자 `c`, 문자 `a`, 문자 `r`이 차례로 나오는 패턴을 의미한다. 
+정규 표현식에서 수직 막대 부호 `|`는 대안을 정의하는데 사용된다. 대안 부호는 여러개의 표현식들 사이의 조건과도 같다. 지금쯤 당신은 문자 집합(Character set)과 대안 부호가 동일하게 동작한다고 생각하고 있을 것이다. 하지만, 문자 집합과 대안 부호 사이의 가장 큰 차이점은 문자 집합은 문자 수준에서 동작하는 반면, 대안 부호는 표현식 수준에서 동작한다는 것이다. 예를 들어, 정규 표현식 `(T|t)he|car`는 대문자 `T` 혹은 소문자 `t`가 나오고 문자 `h`, 문자 `e`가 차례로 나오거나 문자 `c`, 문자 `a`, 문자 `r`이 차례로 나오는 패턴을 의미한다.
 
 
 "(T|t)he|car" => The car is parked in the garage.
@@ -227,7 +227,7 @@
 
 ## 2.7 특수 문자 이스케이핑
 
-백 슬래시 `\`는 정규 표현식에서 다음에 나오는 부호를 이스케이핑하는데 사용된다. 백 슬래시는 예약 문자들인 `{ } [ ] / \ + * . $ ^ | ?`를 메타 부호가 아닌 문자 그 자체로 매칭되도록 명시한다. 특수 문자를 매칭 캐릭터로 사용하기 위해서는 백 슬래시 `\`를 해당 특수 문자 앞에 붙이면 된다. 예를 들어, 정규 표현식 `.`은 개행을 제외한 어떤 문자와 매칭된다. 입력 문자열에 포함된 `.` 문자를 매치시키는 정규 표현식 `(f|c|m)at\.?`은 소문자 `f`, `c` 또는 `m` 이후에 소문자 `a`와 `t`가 차례로 등장하고 이후에 문자 `.`가 선택적으로 나타나는 패턴을 의미한다. 
+백 슬래시 `\`는 정규 표현식에서 다음에 나오는 부호를 이스케이핑하는데 사용된다. 백 슬래시는 예약 문자들인 `{ } [ ] / \ + * . $ ^ | ?`를 메타 부호가 아닌 문자 그 자체로 매칭되도록 명시한다. 특수 문자를 매칭 캐릭터로 사용하기 위해서는 백 슬래시 `\`를 해당 특수 문자 앞에 붙이면 된다. 예를 들어, 정규 표현식 `.`은 개행을 제외한 어떤 문자와 매칭된다. 입력 문자열에 포함된 `.` 문자를 매치시키는 정규 표현식 `(f|c|m)at\.?`은 소문자 `f`, `c` 또는 `m` 이후에 소문자 `a`와 `t`가 차례로 등장하고 이후에 문자 `.`가 선택적으로 나타나는 패턴을 의미한다.
 
 
 "(f|c|m)at\.?" => The fat cat sat on the mat.
@@ -241,7 +241,7 @@
 
 ### 2.8.1 캐럿 부호
 
-캐럿 부호 `^`는 매칭 문자가 표현식의 시작이라는 것을 명시하는데 사용된다. 만약 (a가 시작 문자인지 확인하는) 정규 표현식 `^a`를 입력 문자열 `abc`에 적용하면, 이 정규 표현식은 `a`를 매칭 결과값으로 내보낸다. 반면, 정규 표현식 `^b`를 위의 입력 문자열에 적용하면, 아무런 매칭도 이러나지 않는다. 왜냐하면 입력 문자열 `abc`에서 "b"는 처음 시작 문자가 아니기 때문이다. 또 다른 정규 표현식인 `^(T|t)he`를 살펴보자. 이 정규 표현식은 대문자 `T` 또는 소문자 `t`가 입력 문자열의 시작으로 나오고, 그 뒤에 문자 `h`와 문자 `e`가 차례로 나오는 패턴을 의미한다.
+캐럿 부호 `^`는 매칭 문자가 표현식의 시작이라는 것을 명시하는데 사용된다. 만약 (a가 시작 문자인지 확인하는) 정규 표현식 `^a`를 입력 문자열 `abc`에 적용하면, 이 정규 표현식은 `a`를 매칭 결과값으로 내보낸다. 반면, 정규 표현식 `^b`를 위의 입력 문자열에 적용하면, 아무런 매칭도 일어나지 않는다. 왜냐하면 입력 문자열 `abc`에서 "b"는 처음 시작 문자가 아니기 때문이다. 또 다른 정규 표현식인 `^(T|t)he`를 살펴보자. 이 정규 표현식은 대문자 `T` 또는 소문자 `t`가 입력 문자열의 시작으로 나오고, 그 뒤에 문자 `h`와 문자 `e`가 차례로 나오는 패턴을 의미한다.
 
 
 "(T|t)he" => The car is parked in the garage.
@@ -287,7 +287,7 @@
 
 ## 4. 전후방탐색
 
-때때로 전후방탐색(Lookaround)이라고 알려진 후방탐색(Lookbehind)과 전방탐색(Lookahead)은 (패턴 매칭을 위해서 사용되지만 매칭된 리스트에는 포함되지 않는) ***넌-캡쳐링 그룹*** 의 특정 종류들이다. 룩어라운드는 하나의 패턴이 다른 특정 패턴 전이나 후에 나타나는 조건을 가지고 있을때 사용한다. 예를 들어, 우리가 입력 문자열 `$4.44 and $10.88`에 대해서 달러 부호 `$`이후에 나오는 모든 숫자를 매칭시키고 싶다고 하자. 이때 정규 표현식 `(?<=\$0[0-9\.]*`를 사용할 수 있다. 이 정규 표현식은 `$` 문자 뒤에 나오는 문자 `.`을 포함한 모든 숫자 문자를 의미한다. 다음은 정규 표현식에서 사용되는 룩어라운드들이다.
+때때로 전후방탐색Lookaround이라고 알려진 후방탐색Lookbehind과 전방탐색Lookahead은 (패턴 매칭을 위해서 사용되지만 매칭된 리스트에는 포함되지 않는) ***넌-캡쳐링 그룹*** 의 특정 종류들이다. 전후방탐색은 하나의 패턴이 다른 특정 패턴 전이나 후에 나타나는 조건을 가지고 있을때 사용한다. 예를 들어, 우리가 입력 문자열 `$4.44 and $10.88`에 대해서 달러 부호 `$`이후에 나오는 모든 숫자를 매칭시키고 싶다고 하자. 이때 정규 표현식 `(?<=\$0[0-9\.]*`를 사용할 수 있다. 이 정규 표현식은 `$` 문자 뒤에 나오는 문자 `.`을 포함한 모든 숫자 문자를 의미한다. 다음은 정규 표현식에서 사용되는 전후방탐색들이다.
 
 |부호|설명|
 |:----:|----|
@@ -298,7 +298,7 @@
 
 ### 4.1 긍정형 전방탐색
 
-긍정형 전방탐색는 표현식의 첫 부분뒤에 전방탐색 표현식이 뒤따라 나오는지 확인하는데 사용된다. 매칭의 결과값은 표현식의 첫 부분과 매칭된 텍스트만이 포함된다. 긍정형 전방탐색를 정의하기 위해서는 괄호가 사용된다. 이 괄호 안에서, 물음표 부호 `?`와 등호 `=`가 다음과 같이 사용된다: `(?=...)`. 전방탐색 표현식은 괄호내부의 등호 `=` 부호 뒤에 쓰면된다. 예를 들어, 정규 표현식 `[T|t]he(?=\sfat)`는 대문자 `T` 혹은 소문자 `t` 뒤에 문자 `h`, 문자 `e`가 나오는 패턴을 의미한다. 괄호안에서 우리는 정규 표현식 엔진에게 바로 뒤에 공백문자와 문자열 `fat`이 나오는 `The` 또는 `the`만 매치하도록 알리는 긍정형 전방탐색를 정의하였다.
+긍정형 전방탐색는 표현식의 첫 부분뒤에 전방탐색 표현식이 뒤따라 나오는지 확인하는데 사용된다. 매칭의 결과값은 표현식의 첫 부분과 매칭된 텍스트만이 포함된다. 긍정형 전방탐색를 정의하기 위해서는 괄호가 사용된다. 이 괄호 안에서, 물음표 부호 `?`와 등호 `=`가 다음과 같이 사용된다: `(?=...)`. 전방탐색 표현식은 괄호 내부의 등호 `=` 부호 뒤에 쓰면된다. 예를 들어, 정규 표현식 `[T|t]he(?=\sfat)`는 대문자 `T` 혹은 소문자 `t` 뒤에 문자 `h`, 문자 `e`가 나오는 패턴을 의미한다. 괄호 안에서 우리는 정규 표현식 엔진에게 바로 뒤에 공백문자와 문자열 `fat`이 나오는 `The` 또는 `the`만 매치하도록 알리는 긍정형 전방탐색를 정의하였다.
 
 
 "[T|t]he(?=\sfat)" => The fat cat sat on the mat.
@@ -318,7 +318,7 @@
 
 ### 4.3 긍정형 후방탐색
 
-긍정형 후방탐색는 특정 패턴뒤에 나오는 문자열 매치를 가져오기 위해서 사용된다. 긍정형 후방탐색는 `(?<=...)`로 표시된다. 예를 들어, 정규 표현식 `(?<=[T|t]he\s)(fat|mat)`는 입력 문자열에서 `The` 혹은 `the` 뒤에 공백이 나오고, 그 뒤에 `fat` 또는 `mat`이 나오는 패턴을 의미한다. 
+긍정형 후방탐색는 특정 패턴뒤에 나오는 문자열 매치를 가져오기 위해서 사용된다. 긍정형 후방탐색는 `(?<=...)`로 표시된다. 예를 들어, 정규 표현식 `(?<=[T|t]he\s)(fat|mat)`는 입력 문자열에서 `The` 혹은 `the` 뒤에 공백이 나오고, 그 뒤에 `fat` 또는 `mat`이 나오는 패턴을 의미한다.
 
 
 "(?<=[T|t]he\s)(fat|mat)" => The fat cat sat on the mat.
@@ -338,7 +338,7 @@
 
 ## 5. 플래그
 
-플래그는 정규표현식의 출력값을 수정하기 때문에 수정자(modifier)라고도 불린다. 이러한 플래그들은 어떤 순서 혹은 조합으로 사용가능하며 정규 표현식의 일부분이다.
+플래그는 정규표현식의 출력값을 수정하기 때문에 수정자(modifier)라고도 불린다. 이러한 플래그들은 어떤 순서 혹은 조합으로 사용 가능하며 정규 표현식의 일부분이다.
 
 |플래그|설명|
 |:----:|----|
@@ -348,7 +348,7 @@
 
 ### 5.1 대소문자 구분없음
 
-수정자 `i`는 대소문자 구분없는 매칭을 수행하는데 사용된다. 예를 들어, 정규 표현식 `/The/gi`는 대문자 `T`, 소문자 `h`, 소문자 `e`가 차례로 나오는 패턴을 의미한다. 여기서 정규 표현식 마지막에 있는 `i` 플래그가 정규 표현식 엔진에게 대소문자를 구분하지 않도록 알려준다. `g` 플래그는 전체 입력 문자열내부에서 패턴을 검색하기 위해 설정되었다.
+수정자 `i`는 대소문자 구분없는 매칭을 수행하는데 사용된다. 예를 들어, 정규 표현식 `/The/gi`는 대문자 `T`, 소문자 `h`, 소문자 `e`가 차례로 나오는 패턴을 의미한다. 여기서 정규 표현식 마지막에 있는 `i` 플래그가 정규 표현식 엔진에게 대소문자를 구분하지 않도록 알려준다. `g` 플래그는 전체 입력 문자열 내부에서 패턴을 검색하기 위해 설정되었다.
 
 
 "The" => The fat cat sat on the mat.
@@ -364,7 +364,7 @@
 
 ### 5.2 전체 검색
 
-수정자 `g`는 첫번째 매칭후에 멈추지 않고 계속해서 모든 매칭을 검색하는 전체 검색을 수행하는데 사용된다. 예를 들어, 정규 표현식 `/.(at)/g`는 개행을 제회한 문자가 나오고, 그 뒤에 소문자 `a`, 소문자 `t`가 나오는 패턴을 의미한다. 여기에서 `g` 플래그를 정규 표현식의 마지막에 설정했기 때문에, 이 패턴은 입력 문자열 전체에서 나타나는 모든 패턴을 찾아낸다.
+수정자 `g`는 첫번째 매칭후에 멈추지 않고 계속해서 모든 매칭을 검색하는 전체 검색을 수행하는데 사용된다. 예를 들어, 정규 표현식 `/.(at)/g`는 개행을 제외한 문자가 나오고, 그 뒤에 소문자 `a`, 소문자 `t`가 나오는 패턴을 의미한다. 여기에서 `g` 플래그를 정규 표현식의 마지막에 설정했기 때문에, 이 패턴은 입력 문자열 전체에서 나타나는 모든 패턴을 찾아낸다.
 
 
 "/.(at)/" => The fat cat sat on the mat.

From 18f576efd96464ca62c4c27db6c579edfa97ae0e Mon Sep 17 00:00:00 2001
From: "yeongjun.kim" 
Date: Mon, 21 Aug 2017 11:02:57 +0900
Subject: [PATCH 25/36] Fix typo in README-ko.md (#76)

---
 README-ko.md | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/README-ko.md b/README-ko.md
index 0a5e284..9cace76 100644
--- a/README-ko.md
+++ b/README-ko.md
@@ -3,7 +3,7 @@
 Learn Regex
 


-## Translations: +## 번역: * [English](README.md) * [Español](README-es.md) @@ -18,7 +18,7 @@ 정규표현식(Regular expression)은 대상 문자열에 왼쪽에서 오른쪽 방향으로 매칭되는 하나의 패턴이다. "Regular expression"이라고 매번 발음하기 어렵기 때문에, 보통 약어로 "regex" 혹은 "regexp", "정규식"으로 축약되어 사용된다. 정규 표현식은 문자열 내부의 텍스트 대체, 포맷의 유효성 검사, 패턴 매칭을 기반으로한 문자열에서 일부 텍스트를 추출, 그리고 그 외에 다양한 목적을 위해 사용된다. -당신이 하나의 어플리케이션을 작성하고 있고 사용자가 사용자명을 선택할 때 사용되는 규칙들을 정하고 싶다고 상상해보자. 예를 들어, 우리는 사용자명에 문자, 숫자, 밑줄 문자(\_), 그리고 하이픈이 포함되는것은 허용하고 싶다. 또한, 사용자명의 글자수를 제한해서 사용자명이 지저분해보이지 않도록 하고 싶다. 이때 아래 정규표현식을 사용해 입력된 사용자명이 해당 규칙에 맞는지 검사할 수 있다. +당신이 하나의 어플리케이션을 작성하고 있고 사용자가 사용자명을 선택할 때 사용되는 규칙들을 정하고 싶다고 상상해보자. 예를 들어, 우리는 사용자명에 문자, 숫자, 밑줄 문자(\_), 그리고 하이픈이 포함되는 것은 허용하고 싶다. 또한, 사용자명의 글자수를 제한해서 사용자명이 지저분해보이지 않도록 하고 싶다. 이때 아래 정규표현식을 사용해 입력된 사용자명이 해당 규칙에 맞는지 검사할 수 있다.

@@ -77,7 +77,7 @@ ## 2. 메타 문자 -메타 문자들은 정규 표현식의 빌딩 블락들이다. 메타 문자들은 자체적인 의미를 가지지 않고 특별한 방식으로 해석되어진다. 어떤 메타 문자열들은 특별한 의미를 가지며 대괄호안에서 쓰인다. +메타 문자들은 정규 표현식의 빌딩 블락들이다. 메타 문자들은 자체적인 의미를 가지지 않고 특별한 방식으로 해석되어진다. 어떤 메타 문자열들은 특별한 의미를 가지며 대괄호안에서 쓰인다. 아래는 이러한 메타 문자열들이다: |메타 문자|설명| @@ -191,7 +191,7 @@ [Test the regular expression](https://regex101.com/r/juM86s/1) -두번째 숫자를 생략하는것이 가능하다. 예를 들어, 정규 표현식 `[0-9]{2,}`는 2번 이상의 숫자가 연속으로 나오는 패턴을 의미한다. 만약 여기서 쉼표를 삭제하는 경우, 정규 표현식 `[0-9]{3}`은 숫자가 정확히 3번 연속해서 나오는 패턴을 의미한다. +두번째 숫자를 생략하는 것이 가능하다. 예를 들어, 정규 표현식 `[0-9]{2,}`는 2번 이상의 숫자가 연속으로 나오는 패턴을 의미한다. 만약 여기서 쉼표를 삭제하는 경우, 정규 표현식 `[0-9]{3}`은 숫자가 정확히 3번 연속해서 나오는 패턴을 의미한다.

 "[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
@@ -207,7 +207,7 @@
 
 ## 2.5 문자 그룹
 
-문자 그룹은 괄호 `(...)` 안에 쓰여진 하위 패턴들의 그룹이다. 위에서 논의했듯이, 정규 표현식에서 하나의 문자뒤에 정량자(quantifier)를 넣는 경우에는 해당 문자의 반복을 나타낸다. 하지만, 만약 하나의 문자 그룹뒤에 정량자를 넣는 경우에는 문자 그룹 전체의 반복을 나타내게 된다. 예를 들어, 정규 표현식 `(ab)*`는 문자 "ab"가 0번 이상 반복되는 패턴을 의미한다. 대안 부호인 `|` 또한 문자 그룹 내부에서 사용할 수 있다. 예를 들어, 정규 표현식 `(c|g|p)ar`은 소문자 `c`, `g` 혹은 `p`가 나온 이후에 문자 `a`가 나오고 그 뒤에 문자 `r`이 나오는 패턴을 의미한다.
+문자 그룹은 괄호 `(...)` 안에 쓰여진 하위 패턴들의 그룹이다. 위에서 논의했듯이, 정규 표현식에서 하나의 문자 뒤에 정량자(quantifier)를 넣는 경우에는 해당 문자의 반복을 나타낸다. 하지만, 만약 하나의 문자 그룹 뒤에 정량자를 넣는 경우에는 문자 그룹 전체의 반복을 나타내게 된다. 예를 들어, 정규 표현식 `(ab)*`는 문자 "ab"가 0번 이상 반복되는 패턴을 의미한다. 대안 부호인 `|` 또한 문자 그룹 내부에서 사용할 수 있다. 예를 들어, 정규 표현식 `(c|g|p)ar`은 소문자 `c`, `g` 혹은 `p`가 나온 이후에 문자 `a`가 나오고 그 뒤에 문자 `r`이 나오는 패턴을 의미한다.
 
 
 "(c|g|p)ar" => The car is parked in the garage.

From 4726270279c3b30a53e64c15e317518a3a23ed78 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Nicolas=20Borbo=C3=ABn?=
 
Date: Mon, 21 Aug 2017 13:46:21 +0200
Subject: [PATCH 26/36] Images fix (#77)

* Images fix

* Merge fixed
---
 README-cn.md      |   4 ++--
 img/regexp-en.png | Bin 32144 -> 32399 bytes
 img/regexp-es.png | Bin 34234 -> 34485 bytes
 img/regexp-fr.png | Bin 32922 -> 33191 bytes
 img/regexp.svg    |  24 ++++++++++++------------
 5 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/README-cn.md b/README-cn.md
index 6f233a3..92a6243 100644
--- a/README-cn.md
+++ b/README-cn.md
@@ -26,7 +26,7 @@
 
 

-Regular expression + Regular expression

以上的正则表达式可以接受 `john_doe`, `jo-hn_doe`, `john12_as`. @@ -88,7 +88,7 @@ ## 2. 元字符 -正则表达式主要依赖于元字符. +正则表达式主要依赖于元字符. 元字符不代表他们本身的字面意思, 他们都有特殊的含义. 一些元字符写在方括号中的时候有一些特殊的意思. 以下是一些元字符的介绍: |元字符|描述| diff --git a/img/regexp-en.png b/img/regexp-en.png index f2331491b387f1fd9cb7b843fe86893ca7fad475..c38c90fb009dd72770ec7c32f5323ed968b5b07e 100644 GIT binary patch literal 32399 zcmdSB2~6%5she+ zN~KAp@xHe6|F3oLy6diW);a%k?mE``uHR4P)85a1p7;ATy?3aFy5iQ&Oq&UU*s81~ zr$rF!JP3j!lX@e*A|5bThX0{-l2z8B#vdUP|XGbS-A)$-b&X-)w4_Y|b3wc^uIbAw`*+t0C>ipHq zg8zOo-NoUZ1hJ1$mOH8A{&3=}hmnr%8rAgn_0&AnJnWg&gLj_|R?!6CUy6O^a8GqH zTGM)1oA+_v&wJK3p@s@J%IUHE&%Onx^j8&cT9?vvaNWqC8?9g1;_hAF6Mue>%v5K1 z=SSm~=Y0|_l5+`8t>zqowEH;lCpCp==QXiL)cvVxATyctHYf4H=q4$#OmkN&^_wL;z{Jy_? zV6nRVcbK``Darfyo`a@UH|aPP%)T|<8D>#0I(+2Fhg8MwF)OUBtX<_UIW6-E;x3!{ z^>Y34@&u3Cbv=rt4Gqck&)TWnTV&B#=r|zDEaAH4`Sa&(KG&{Y`!)8Fic{g{%MdzF zk=WLzrkC^MofL$9Ps#Pr(9jx-gLxNQ6WJvtnP1L*YpShHdC1w;dxul;(53hLc%N%~ z{u;eglfQ?RH3C0X^Ytss@87@c6WQqL{W%pQ9$9~UyfIukX?AYz%AcRc))EpDd(WLa z$K@l`SXXB@(vpy=n-g0lyPqRv^W)kB9(#}4y?lG`$ep-2svubkMn=Zt;^G_!4{n>8 znW5gYMb6#b{f@GUyZiBS=dpE!`{FO&Y@IAEy@5D=b90WKQd=tGnalVtrlWTHEp*mX zc~5&~FI?a*cbkgXF1sJmVW8p$C%R6QUPU?GP^zB z-`>-Xz{Ay)Kbss?!GAX2tRwea)0;Q1{3zBJdd}N?Dljz__gVUFZ`V_@>Bcq|zDAy` zMZac(@=B>Nb|UmI5YNL_Vu`jDx~ zInh%}6B`>_JhXN1(Ylc&-w2Pn?=jkeI{KEDX}|jBf3)*gpU70gI$ru*X76$1q@3JF z9b8ah;UU8B>C>kw{%3FFnwzVHheB$ zs(snkmglzr{PH{?K7Kc@=2d$;!^-0PsiohO;kSJM{QTO~+Ny~E8Tj@s@YYrnR-;&}Dy-S)}J$y;$Io>^VHon6*ey~*3b zsx`H=1V=^fSo}2>&|7)Uc4Dp6cg-g)BV#>*3*emGzIpTAc`j#X=fJqQIFrE&_Zg1M zU(31dFJ8R3o={Jc&ZE!B$T+|xYNKQ6jg9dt-}nXX-n}%6ii$UP3$HVN;VM{slXjhA zBy0Wk^;EQsj8sRC94WEurcYJ4b(dB1?0)i2wY0UZmIMR^g)hB-#PKHR#*LwdTYEE& zUmPuWoeX>7Hf4_WeCEA$G+Qq(?5wFb!>JqF1j~H;(^cc98`*sOv4Z4+1Z>>eKR!;g zeS4%<-(EVpEOx%aZ7kx{g!!-058`nyPEI?Bl0|%4qRQV+lWV8r$$G*|3k#!ydNMLHd8RoG{Cb(uzQZwRDTyMpnsqZZRBV~i!otFIs&NO~ z-B&U*c|JUMx>(xzq^xY$=cf*xpDVMUIFD&joG7vFR3AT#QovW#k*%B4b=B$nTU^tl zlL2)oBSHA1B88Rts4p!gWqgxW%3yNj^`}odUbC+caLCA*jxV7EPU?)tR$%ppCc2+= zJ-N6YPw198(Y3ESL@I2Yt$==ELmcAo5E*v=~XGK_)WalAut z`A_v)J&I-jj~{&eQPI(XSP4#XaVC6XP42lT?~AQeB|U#p<20QzGuy|l7Edn2uZeDL zhd)LJtE;QHBMRc7j4$hWXF+Gy@~yqc4tXy+ews z6*;-gEJMo*2gxqh%Q%l}6j^`dE){f;|NE!UH$65W<4lr`?sqKrAeN0Ol6U-t z`%FrMc(kAgYLj_w;3kd(2NYc;g@n!o1_x&gqIB{b4|U`j8q^zUd3bo#e*J1p(0VWa zqQhT`hiYnSwD{Go2*7zpQP4V# zw8XGn`#o{*Qd?RmK`!eft=|tEs_2M7G_vDP-)}b02pX0t<>Hf^fU%HpMt+&#Ml4FZ?`Ozr*FQ|URcWj(|1o{QZ}?7OvJ zFf28dv!lSY;P73|WDT8=mMJV)?02)Ji6^a(G@AN$nV6W2etmI_FhfzXVohTAaCbNR zl&M+ljl1@bjNDG(6v?^@96h?LdUcVXFdJ)2=kw;G=#M%heO)&BC5n#Y-&w2m@+QAg zvC=!NxKPlno0*0yB2;9la}7#26VojcQ;$%i_*^2`WLUQ{iJb8C6!-V{-?CGT?n8K% z>;Vsg+&EgB_(KfhQPj*oo*K8VhE+=llU`?khwB-#q}Jas5=ed!k-PD8Z&_Tg~s6B62f;lc$b zDgoTvDbKpSOibA$A#cv0?0#~!*QnBqWRr=VtiC!N_KVZ5={CE~xQMXubyRY{k;vPj zAxge{&PkH#i}T|a1GPc=&m7rPQd8-enQ!9w;@4B{*|TT2jE|&=&tEGPb1jEXHJo<; z4K#&TZ+2y|MTrMhcYU&M&yMLGJWM&vSQHf%)j)T*Irh!BZTr zAhV*{pFfwlt?=vqy?f^urU#hDb-8ZKS{S2O7X5rxE1Z+8L=iQ!jwo}z8IOXALn!+t6rdHlA|ER>o z%Oc8&`8i2ERCAUWFWQQ3dV1A{(L$rGbF+Ju$oVTb$4WUkvZ?uu@1E6&WR*H}^_!C2 z=d!J6gC7km`+V1=@EbLrTsTchMU@Jyz&B#oTXAlDar2)mIhUfHD0j_|KJOQ{P@Yzi zeJ*17;HZ6x%4~F=kr2nQt<{AK!GVE+<|7}5e(aT#Thz^pk|Z46+^DA4@-%;pmWRBU zeRB;@)@Db=^0L>L7j9=V#9egTf<{zj|2ECm1W?h+W>&fy88H(tTUyj7>plpDZQRO4 zxUYtM?(MDmGN_?$p}jz7EuZ3*2XJ%e-o4Orm+@F9AY-A}u&;G#K`3$S{dzPbRJLu~ z*5-TQzyU_XjNc z=|(H39$Y_^{^7~RGdw#t@87?_e_>{5W2K&EbY#a=U-fo&x##to(WsZINy&XaOL-4d z**QFCbVm0(U>E6EdY0PN_WPr6ah-ngKIg2^t@&rqo+(ADZD&5NG2s%!$%+5tha2xM zLjSAy(|gUJ-joTILTfPl^xO0g>8gy+oU%k&*H8Ru~sVaPP&yj{lMbSDnzDG`( zUhFD7Pxu|{^U^j5&M&-qa|>|cYqKjn2i$!YrrCc_bXydTM+f7qW2aL{`kFE%Mkw$e zJH}YOwkknSPv3l45=7%{GFvD2fdfNNTBQT3t7SHBXT1ru@v^3dg6uekgV+jKSA4rcgk(HC9j6G-^78pp0TVg+axb4v&8OQz;c3p)OXh~o?C+5DtOD{ER zj9}qEZLDdqIcS|~tibhx0-@E_C5K<*o!gIGcG@>ixE+-mRN zh|b&hzr5b{!cE9$ZN;r(wwZslBk#d4{qDv_Dzv7LpG&Kjeo8z9B{^GQBL5~YktF<_D!tT>%SuO>(o%uMR zDHF>$6vnZ)`7-!lH#cjY`zSo|v2jgbh4$ zvBeBMIpo%@`WXJRB4vp?=rlJ)PZ_%U=P>K%#DS3OsYQSC;fy*5AS;qGZn;tpCCl=%Ti*O>5Hj z6EJjXj>Jwq6MmC#!^5GdBZi*uXjU1Xy5@;bRj*YM`!;Ub{ph#5j!yJ1R*gRw!D4WF z9=96m+LjoBf1B$j)gK+E@rc3d69sQeBQ6c$I(u4kD%fpj)b^_RQX6MgeM=^f&`SV`% zFY$T0@bK_g*iW=gCK>{h45l|jmFILJW6Sm$KWic4LE?6}R0 z&Qj0tt1F8xSflk~Vq!#MEC0D?!?V)^uMGa2op_%dU{~2YJ?%(-yVSN*p)=oDw(4r)}7Z{LoI*?zY~x~=5VSWLKCgc|fLwXb`}IPk zV329~KdcDE7$_-G2XEaQ43NUHe}7uVD|WPnL(c{`=-T8NK5eKEXQUupU0vOm7p{nr z>VuB(q1UM@dDG?fUJ^U#=%gAOOYznJYK`Lm`+j2XKX~xKPJ)jw+iM+rwxz7BtmEi= zc2wzTHy)jagGSH%fL_QwG0d`gPy9I#suMa)moHxqxp_0XjFXdd;KvUGABsw|t5>f& zet)}%tPhL_jZS!ZNwP|NQPa@SJS#7+MF~NTfsO$tY+xfxO)4TItx1jOvv(dmpaF2K zm}`-ck5yGyZ@9~)8kX1h<_!%Y0SiDe+MuFJGRx$t+gA2xyW&#RNhcd^eOK{E!tpEXqPS1{ zqYK~>HcK$4Xr0HeOCRj-C)n87oX6TW96Wfi@X3=?IQ>{aT3T8^)M%6w>Vbg)?Bis0 z7a4pgu!uZL>DHazGl8_!+qT7)p%&h%sHmWq`uf3 zF)@WrPfs5X9RruZA$Xap7-?o@74-P@gIeH(x_RE6n+5a>Pejr&b*wD?A+?}y-@d(k z{dyCmCPj3CQod^=Ei7{K@-<(+FefG^78VupmZ|CK?E91K&_~qpAfBE{=B|?Io zodN||R$YA?fNe(G;60Rf6pXRHQa~f|`T4g%`8chhQtR~%3{p@H99>+3fCO8LvZLbT zLmnJ+;D8Jj5fMQW0JYPnOAiVKzQn&k4U9zPPlc>fJTx{o77`XFi@lhen@eIZkxTE1 z@87?BhMFe4eXACD;|8ac6wA@0M=yOy3F?^QN(Uk(fjG1!d2s82!NC;W=L-w&WNASw zMeFc?^2AB`@^wm0uJ4nRf`pPUDAOD8rKM}Xd@&ln z4~{`gN(sBia|){Xh!6;8C-6{0A!pD8$+E|+ElpJi(aP>Wa3CBc(zIfE_6=XB2G7nE z-?i02uyy&WgTSx!Q%z9d( z%3pW&%bl}8&9r%U?AgPc;0Aq-Zuf2;BV*%q@BIAyVy7Eh_Hf`a=?)e_=r|R;g?Dzf z9f}|njpe^{?X14j{nz6qJ&FrUN}`Qho10bC62x`Ui?Rfd+4qQ0oB(7~ko1_9Q%jUQ z2f0vQPZ1rc4!cmaVHY@UFh2d76vO7A-G?nh-0@kvr94ZBeHU6DX3cq5hjihvZp4L! zf__r?sjnBp>b=M5sB3KGgfiLD(c%7gIL>P1`0?XPYYBKp(7uK~WoZ+BC>6;7U-(E0 z|9}8GNFQM8{b)Uxz-L&0=2}AbaYS!I^{55fBRBn%C;Tpz4wdt}pgXQ7GS5BXhH$kR zqN$vM0w}<`lP6EcAGsLOqZf^)RWZ}Bmsa)>Hr%0O#}xJTcMlE@rcrR3de6tGJlD<9 zBNbZ|TY!BgpUyUYwIFbzRw*I!Sv0$sUs1>1N7#1%U9e0EA=AJh!M zv{NyBy6>}f`9I~H-CkB!_RMKyTT7x;I1b1FZt?iF-?=@jiJF?4;K5Ht{8Fsm#F8IV z{N%|M@-WNEkzjJ+*T*vyM4myZEYwYBACfH3Gq66dh8UriB+Wu<(A61$mH8%>C?SrJ zf2raQ8rNbci&SmIS#3y>4>z;7-zp>|M9n@u`hk;ZT}pEu@7P*Ygi2j_0uNIoL!AY* zij-i^pFa-(SkO?e$^qgHh@(|4hkuDiGKdF5V&bEhzl4BafD~P_Gk(+3qA=B4NtUmp z_C1fl|44bT_SLH^=wrVoKQksLC-a?IN55mo!0>R8gxk-TZ{KdgX~{ILmL?T?hdycd zYuCoV6#NM~+oH^^nN`SDFbD;Qkvs+De*g*$GOG)zcnXY!9KKTbG2@I&{>Q#PQ-bzu zxeNbn1qllYT9g)!Lx(h6CjeWt_?6KzRCX$!=dypzznr1LQ}^=v`ugEFajML3?u*){ zEs~-X$QG|eVnTvonL}TG+uba?*V+xYfgAs6B=JDWpHlt+ti_B2e{~K*f#X~H*wz-9 zl$4}%R9f0(nAu7-Q8t+tM~p*2K+V0a_>Y zYhoo)KXCjx+S=N5e)>WT(F(U1h}CBgR62c{0nhp1VRe@SRMcDK72lRUOdnhX_x5bTRB>80jei(J& zjEeANS5c~5(N3Ma`&+>Xv2DW8KSH5JH?y*#|LfY*Ydu8Q9HSfRDzb3l%Tb#}$2idT z@uO};V`C#A3k}7Ii7(H!Gs@@Y=Hww`fhfQ^h#6|$-wF)-Q0kgqMmbG6l(uLcXoO0x z6LF?KcTD=wFKvu7%9Kr#q`fH#VY{wFw?+g^D)b3jNLta8Lh;{99r{crIgQx^~eGq@56`uVEI6ha`qnB{3wBYkExf*pig-2 z&pSx5Q&IHt_sG}VfU3kY-S6>erN#7XB)(Dn*8(sMHgQGPK4I9y^rswD7uU;)ycexQ5 zxDSdok){|??m1c7sgY+O8ndFVt`3Esg6Idn5^uLQH}^kiTuu-zNiqd9l4xo%6dTJg zbr*Bl+1Zf_Cy-ck1i%js@g8^|2QF@b=?8ky5X4Ku4-Dy&qyrQmB2k9EQ)IX$npayy zy>sx}H%fv$@OU_?JBsyI7srJNKWvMJO~nV);`g}-zyEbE+qAl>;qQ?bF5?>sJ||jM zNq1VPnT2I#9qy9=iE%cx?ct>1H&%~&v@h@kFyGI<>PRg14%lNg(6ZlGUUPdW?cKAl zQ#Yc=#o1X7l};ovV{ zYz7WGeP4uE(<^96d{^4Tq(g#&rzdC7aRw%z_9>ugYZRDBk^0->=Mw83L_aQ#Y1{!{ zD4H4m{@om>bhp^m{r8XBZw5aZV-mIPK*I>`8HaGY&Rx3Juut~XsdS$Jl=-gbP8mJb zSWuNzx2dl$GRpGNwQVa}(3Z|aDhdgq2E7>~tuqac+buF1OVXF^K)iH@n)>;4vz4Yq zPjh|`FF#-kO7)r&!1oQ_Od>H{1}Au6mS|?gh+=e5EO@n zD%`zlpB36&ySVEu92~Y&QBhfk#o*=uI!TeCxVTwPshjEX8S?!5w#Eye$~hc#R#h`w zJ0qguFiEv=InzmN%T)LQ{U;Z;lKog)Tbt~aAR{mLI#eV-4SnG9S0F*!+rXmuT&lv> zTUMf#8Hth}>xg=FFB4Q5-s>5I!ml|w0*Z=@YjH+}J!UN*O1N!%{rWXoLQM*i?XK`F zbD74^K0D|X7ZZaWMy|j!-?b|B;b^BcJXt0Vfm_gfr{_COUw!(tlV+E|%ev4Vx(bOt z3j;S6zCUmX%T@dvRPY+61MW2#tz!s+_(}M5y5FsHu>6BVL!uoCad8>%1jppM#V^{} zgkf`B674kk`1o}DPobZpyG3nwZrsKkf@-^$G%Oq)50MNUV%HFqwyt6;8dCl#jr`)0 zepCK)tJamGai|;ge%~$imG5o2>k4vs=Olw&7F3n?Yj-oewlJ}<7=QCXYalefaeke> zn~<>e(ZcI=8tt-vd3kwu8JX(0v4cHj_Iq&x{))_RxEUVK-!2O0ZU#t{AV{;?b#o$V zPIxg-OibLwX0i2BGhk}&l=>L(MDjng0Fb5EZ`{IDCSP0v1v?l<+}481-%NfZQF;Z? z&apKcNbT&(P=k4=Mn{9HP$lIfFKN~0j#Kspr+dyPNpc*{MAuPS%Uh=Z5L?{-I5T#G zRpZKmGl~766*jGOvPw>)E~D>HX6)WFiEVq_XZbiWDoGW8)$tTOB`8*p|8$9j-n>aU z?bRPBPI@5oKB|KN%33s5(2Lp=oxsv1ul-h=EJFKONBsWzHRt!0C)~|{jC_2m8pL&bBRk#Y|ooGAu59Op1W3$2Jspyp+ptTg!eQyD%!j=EV*>2 z$LXj;uK*XfMZ?Vxyuod4zpS!KV2QzPTSox?rf7eK)1(Nz2a!_J;ETmkZy@cB`_A;! zK-o@kK9gR#ae6IbmZtgLyP)do>V{c|ikaY@Ltp>}^DZ=H&DP~q(1~ucNbDk}|BfW7 zs+L=8wKa~_$7oBZylZV0(p(9;1rHZBqN%Crw)E2=@A>w#q<#PP-MjQyd2doI6fqlu z^`om?=;Y)yFfx+ybi9)1-#u<+K2D3>*a+ZC(nc~XfmF0KtP=k$vG{D`;rMQMmb zW-kfnsb1re;n4dcO4ufF>{hPTTue+_&0 z;F#(rcQD*oA=7Ozd}B&4x(p8va(Itb&vzIW%L$>kz6##@3fFty$|}9g3s{;gA;e3G zsfqyLoHwkKk25lcfFEi~tUp=~|M--}xmDqw)U~6y3xUd!&C-0!%X6)yw~yUJ%Aq*p zF9cq_K!4TYFudRer6UeQo9ddezD_BsTgWZeA%O4gOtWe;GX9l*=SuYL<@ zsJfMQ^7*^>ifL32w>Nt17E z7!7hrgI?YJt%tk<;5K*M_4OZ}dvbxaE+3ys z+UDl=hu+izA3!z&lH5T`vA!)^BYs*;hUY}+A_ zKy{P{4^lHn^Zt*=ub?Aw!Mh-Z_I=#k3QR0$ou^A2`dCqTYT|`0(xgqe;8F89kG`kC z&Zz;63TSFlN=r+71Z++6=z;O^oZ<^pz;$Gp;+yjxs8}~{-MXccbllL;kd(5Md=`0u zErRe+K>1Qp-{VEB>6e$6Nt@(fVkL^E(-8Oo6)vS|>Br}%LSWwmQ&W*-OG9~vvUC#I z;E>x-BOuA4+8`Pwb#=WxUuh)SzOIZHRCDm~P{Xup#9;}CGyDpE3pT;@@85c#Jr{p} zc1VRY*j4Q-V{UGqc6k#}X;eZd41Wkh7C5e5mDi4ee$awOtE#HPYmEa zW_x*ii>k96v2NRs8@2!ef95*Lq^73UKQM3|>sNzN5O@P6QMtYUupYPU=zGqXOn(S@ z8My&&fCJDNn}r@RqH9S5Vx^7IHfuwJ4hl&veE5(#{{DR?XTCUCXy3knk3F8%u6wSs zWARx;vW2MS3Ywz(?}>Bwstfp=FY@y9(*XB_?bXBkh)6zlBi2ocfz@y}M9E?2X8E9n z!-U59L7rRzdZ8d$%?q1YHCziyrSmOD^|zj@PWENKq@^jXicY79?u(s&;dYGLO*+6$ z#I=IRdtIJ>wH@TWti+%hTHc{+zwNBm6;M~ZdU|3n#>Z^LFM>EPs}Zr0D)FgN*jnC= zJQ1uHRLMsbwK>k{HRLB1Ui)*I87zS8FDUPKAo(L8M_M2d^4yWdX_lx{3HlcS)TKsH zs1~7`W{EASHPZjR=|EkZ-rnBgNq^Oc_=S~C5@n!@w1-a`t6FcIx`Tuvcq z?%#K2=H_1g)BRCc>&dDn#=$WJHqF7ocdVImJAo(NEKJWa^a`46NJtYki8whp4$DIH z#h;tBQTRy?4$iv&lfIp)1rQKruc)99tI7-+iD7G$WcH_jPbjPL|D+rFA9)1#sM+N_ zs7~rIL5(lAuSyT)+wS8Ny5)x8|8s*K=0`qt%XuJ8xG9tbPWG!eZ*siW<6-kzOhhTh z)I!g2oEelyW#m;VUD zT1@LS_Ui{6(PHYDrp!XFNWQH&LMZa1MwdxHp~O0h0#|8|jh?x3@;fZPyQAIR-C15O z-SlU44l}!-j8Pac{S$mpQEm~cTY8zOv9YSj0A=gDceggNYHkw7MOh3t$8dR0{1_Xv z_PZ3K#E8Df#n;GYEysoZ!M7E?0u6FhCpeFgV+cq}G7a@f!@=MaE=}DTe34$AZrVk;~|s zL%%VzwKd#`AaGg9%AJjVGHoF$p~|efDv%uEp>(=``S>x4{Oz~PWZJmTB)(lOkxQ@h zn9bB0#|MZMWrG*7pfQPg@M&%+BduhaPo$5+%=|XiJw*$SRE&X+&Q5$O{dsA8Kb-`nEP--^zw~(?dRTH&zwcr`}TaRg}-8&soiVNR3z*u38SWmnRmP4+lajM zxBWyv#z+f?EcTXu=HP&YJM`i%`Ypj7s!tK- zFA}=`p7TG*2m;^K?dfl?caR0yZFhQ^MdLOB!!orYQs=0tt4ot3#Ue9s*JnN};^2dK z?%&@`?3VUAzPi-6W+QMQ@B|z(Xy&BSMA|e+bs&w(r^(!q0%(rRpnp~tFKn=Fumk~! zHzIYJ3AHclM{kw4gkG-x^^*Y`&m$G$85VCMr#9Qfvy2qb!eF>i+9VmSh9Pn2$j4Q| z#HgqM2<5httH3x~_4?iR-NhS7v;z4x-5ZB;v@IP(T;C6Ra@;uq#Ge`v3oOL8F{<=r zK+A&~f8)V}y*NbvZoM8WmjvM%x5vzcN_2iA-+e9~BR+tu6^60Htfm zvYu*N9hzQA)%PG8#!st$U>v6)0NM2c%g?+%kYv`HC^ZUUwWE_q?XNU|k$mX*zI6n3 zipo#yXW$iC;`T}<;xFRuJ6Krqv=nQq6C~W2Mz`@*K`mkY+XFQ)1nPc_vH%QPTC{Qb z25n%h84~p>OD>j}*N1UT@gqArA|A;sre&FctcV8h6PT79Z+0$UL$sm};_$C4OY)1b z1A?-$tnUKGR*N~}E zxVif}q=9T^!zwQ^m|ChvZW-zc`vPyT;yar6HTd(e4CZiu&-KZ#4-7{C<1t92k@xARRhm;hHEH#{_^N1xBTXYtfDk90z;_`iD1U+~im^wk! z)z$T5iIvpUKB>O_H3;iBM$g2Awc+NTfYH%Q)}{lEPq0VHJW8{;Na~%$#Qe4cnb_G2 zh;z*Jt*tVGs>J;s85tQ$jgnwFep)q?LTK|XaNkl06%VKY0X<45hXH85<0#+hGZ+6zlduOL>EnzWA&i`Z34q;^Qf zv;X_|U_7=gNe*s4Ee}z4`j`&VVZ0`%1>y3_a5IDOg}1xASD`hAM@L7SkMl1-E5m(T zIWjVQ#uu#$l;JehA!L^}1S+EKq2q#$9#A(s(S1Y{`>eYZjG0ej1jk-BS)-{%%Oq$C^$+UJoB7J#V!7&}3CKZw?inHt7<^`I`)5$Q1dEULumXY8Z-9yf zFF>fM2a8r+dFDF$KG`$ep)Q23SRbLSRNd!bxa2rR9vj<%{rg7+FC6wEyHcA&^-3_Q zKlWVylt~Ajociq9vt&*WCLoev>xq8U5jc^DeIVx0N2+~NFfmE|#48C~3Q?{TT3Ynb zJI-5J1b{@Rz_vrI>Bh++!VjQ!2zjRVEH!Lg-Hm4^zP>nHCI!<4_*B2=XJ-K$l-)4U za22f0=NnLyV)y+>LAqU)Q}+6ZAP)#+Y{C%0JnX9h7)5PW2=rvL7)_@j%^qjZXy@Ht z2Nr@nI8)^3&z~)@15jD=OIqJY+E%apHY82ao`}fEW25uVRu?ZG_}uaP!z?+L0H*W$ zw=NhTqBEq`rmh}w(y;OMGqMAZ;IWZet@O1a+ujN>tOn2NF{C1a!ew5<1o)>(Vdqo9 zk7U5QT)Z7m&aB`P+1c4o4vG1$%rjOk4AMCN__PTLUy`<;G^a?E`R*~2;O5MC#B0GZ zX8+W;*HOij*nK(C<6oXX5qOQHPoR2dyB@4WyBDbEHi~C(%=BZwF;v}POsMiP0}E*; zlM#7wo}#?*{kn2o9>zhmUC*whme@o5M2utWQ-{6=9Gghg0CN-^V6>M>zN?`q96yd& zdQudgVb$eB6-MWI_9^8fYBUg3&f9KM-9b&NfpgdM2lR`{&g=yE(49>tCsC0aNXi-& zWpP{o7Z(?oeEKWc*ps>~wx7%L?3Pf4H-;X7rVsDaD*bl_uu-hCWK0md!F9MxK~q&r z>SYe(CajJ~9v&Vh)ADeas7RFv)G@oFbqlYsux3YN2{^!RN%z7DW`waxEt-t8BTuVq zuq8CCHdZoQ2W_(m2iy7ueo|iA$Dq)R!o+)C*E+GFctJ)9vtCHJtcTTby|PjYKTEot z-8_xZD+VB@HD+q2ZlMo=MWQmRtD&H#F7P#QM>!>vsY3?%t;BEYxnNoH%F&*M~bEW_u75T3|x2{&;B6nTcphDA^p3@Jbzt^ zS+!9?|09QZER_?})6<)kbX)|PaA?VR|M%9U?O08(nR-Sj19uWQ12Noizc;F)_G9Rm zD(}4@g0isj(!Akn@o5JmUxtyJp`c~|ow7{|N$azfJ+6?(gL?AN;GjROsD9Mx!}s?u zLbmGy?pXah!UoQsj3qXR;a^^_^nh0fJ$nPFJmib@?!64dLyR$7-6N{by6uC5j-DoKsDNDA~K%0?>UP^JBYVp7!oo z3?p47%xq*f>>8>?(#GmD+o4`1<;i;pH-i*LS(# z66%Vb{c6DpYxqSZ{8pZw+0_g*k)t|`fMt%@s~i^0B9~|{v?k^i_cb?f2BagW+e#3^ z*z)t|PryG}Ev>r^bhm=2HjNsdI6=S)H~A(;T63MIzV`2rlMxH-adHw0Ycyev3l~&1UC%7`ySE?^xzTA$D4MyoDF-378A207F ztU%)#nH3$o1n2`dl9Jd+&!^wR?FOp)znmn(MhI1^$Wjqx>5E_%^T*Iq7Bj?3re2>V z`?rZwdr9E{wtvn?PD_rKD8*kg>Guu@!IS?r)n}S9d>8#%w4)QkrTH5n<8qyhr6qVH zx+p{ZqG^-)v1i4fQ>v|f5hWQ@lgdUwKv*ASZm#IYF{ki3yxUJb-$bCVY# zpswz221CVx=d-LbKDi%l({phBC0+5DQp6<8pqGzwDFJR-u$c`7F! z<@x|J;`=dVl}&Gme1K@|3(xs%y`;aGN()7N$(n)Y4y{qg&CE~G(g!e02DN!iCto1$ z(jvOfG;FQr-&FohxwX<785ueDzofYJ#+xhy z*igml(*Wo;Y`oP<%q%Pe6BAot$S1tHfB!xiUBEP*U`1smVlxgT%^;IB6BQe1cIjkV zHHujGlw>uGsiQOp12Qy6fJ6+T4jZ%^L&H2SCN{S0GdDf`5^GBSN-|&M-v_aP{_bt@hs4;;Om;uafaLH$Ak zt9qOMMOT+T=_ehfeSG+;n;ZDb13TyEM|TKiJbp~FDbj>2DS&T1+E*=u4;~mD)wlH6 zv17-tpI`Tq@$=c?H#4hCQ>l>pGYy~S=Z4q9Z6oJdL>zi6DBTo=m@qDzuJdd|EA&%@ zXvmDZo$r8Vg#0}WSeSSW$8fZcy-z+>G%u&9Xo2u}aYq>my-~J#Tq%=anqvqtU0UJg zTwu|3U=yQ|Nwhs<)s#Ormd?cf_dPd*^9@S*9;+vWWoc(*GxJxdkp5M8UO@@u_TcR@ z%Y{u&VV=gn(g8S%kHapdI!E&p+ddF2e9Y=mU}>o+8jY2A7uqMk_g$(?b-Ubma*YUB z6;rl$ckcns(YW_Yn-KvjQfno7>oN{u+bW_b+#YER=y`)F}i@6cPfbk7;fKcIUZr1(-j{!nrkLufK@NiU4%cU@;_B@grnzt^&h|+!hnAc0t z1uGDQJ6G}zin@BL9CJgtR^_CU3@1)CHjvENqM!=m;`}fHO*oA)f`@yOn7OoIs)9!cNwfR#wT_ zN0<&2hm>;@7xc2Oj&eJjv>aN_^2&M`3^O+Eba2%-K9=2GT}_WC zHc?Z*L^(Kw0SFTEAuNm}zMQP=y31dlU5A7DrNTp7ZvHUY#rVj`8l*K|gHHRBW zW=F}SJs`I7{Zn(`4v0Xl1H<7=aIm)C1Qjsv2lwDkKDjmRHeMZ&mSZtl+mLpx1LUgr zU7ch5kbCY(=|^^4^WF&)ahD%yADs^pb$HzE9rM_f*2an_PWaXQR1O)@HriQ1LMu#A zmG|i5=)x(zd2&ct#5hAka|Bf>rXA9jk=-6Zt%N=qG=X+LR)D^9&ykR{)@|wSH5rM= zgRykM(NN5og|9}3h^Ik48R0zFO}02gZV3s)k!y?JqRy0r-B9{|Pj~b`vjEiU$+9{& zfV{fr9!kMxs9v6>f%(NLb(jUS;2wczZ7?!_PcP327=&kTUiHb7C%WACHYPq**(KV( zc`PzCbQ2iL4OCvnYdG-v&2rtyPm1bXN*@HTg&Alo>vQF6`nvIAR@{N_uDg08n(TTolwtwIJTaC^{M#6H9 zUv%^r!9Us6-HGYjonUba?(Wa@QX@?%gA{|aRl{fuVYniut!=sPu?A27&`tq zzUPaDm)!Kd?TDzT?!D>{w=sbcfsV4v!xZU`x(bguG7W;!#!JR-164lqr_ZEWUcMYb z^33KKe$vK8Qsf3~CFRJ6u=zBeUN$DtH|Z1N8>aDNeo8WGa>_nFw0n|a2X_BrMS!#x zh1NNn6L1oWi!6+AL~=ji9AQ(|Us{b6J8}f^)`usIj2?cVYUl>7%2szB}1zv-oS(y8;<6w;!=&pDUs%R+Iiz972G6i_(|-0b^oBAF)sP` zAm7b!m2aze7NASeKkpe6f6;EcJ)i!EdfC%)VZYs#%>^z9>KY(0dN#*ehfD~k$kQYk zl!R$H76w0mE(VfO5a;P)g@*txm^W=`*rQrK zi6Yi_n=k!rP6Lr>di$2lfi*Yv;IYQp9F*mDOA~?sysDV2vGeaj*0h(q+~Nhyx%_E- zhlwsea#vutzxfSOZoQv~R77$D;!Wjx&}N#gLS?*Fl$AB_9iS!NzI{7QPMh&*TBx#) z(LhT6Kw|*~m@n@j7oyuCnB5v>Pbr2>b^{RTJOZ|0TCo$t(-2+?-Dk`L8lmCt7o0qc zFknDS*4bV65&t}GW{2fL_fA2K5b;&>tT^UyaC2l^tf;sB2D+RT#~L-&E4Y)DDFDfw8gB+qZAeZo9$9o9}*7ZkQX04Mk}K zLCPTT1%{dFH2;z#PNdKegP0(vK471qT)sJWD4Vn(HJ|r0?z!VhCeUD_SS^w52Fnqn zEvIvC=87O)%yR^kUVi>;s4`9LLy85y$1vkg%?)IhJA1!7K~9fgug9H|)45l~6&cd} z1&($ExZT#kCvpdZ|7abhpwlG)p6a>X383_P zbD2|eD&zva1^H#?;!5wDTaZ@}x-WI@_a*P2C_-X+o2`QYnKR#FE`A48NP{Fccpuif zqd||}rS|xfOSEg(g=cZgbx;3 zjC4ku1IvYqYd?7x$tx%fV!AAtIy6(3=S%bC$OskEKiyTpL@G(!(J?Wmu@mExj!sVe zsXSSS|G98Y3t6`IFn!Kir_;cV=_uYn96NRl(GLtRpVT?Gfs#^5@GDjtKN9D?&2MDA zAb6P3whx+C4IfJ7bhvjNG~y}MCq3r+Fa{)^uK5|G#LP^13|8(kp&Uwl>rj$^ZvsELGb#qUibAt7bKOlDZNRCUOGD& zF%_HDKHm`xfWnGz>Q{L^?7=aU-Jq7z*51#^+Uj^rx(uVo*cqEQx)2qtG)hSo#?IH3xN9)Qeom1`!V?ja^wGai#s~xI-#Fn&2;SY z@?6=eF*lbtZd0LwSUf@C ztsBZLo!{y$ZEa}`4L_IXH^{6be{xX~qje`i3el4fA>4&gbuv!&%z2ESeBBY2fwY;B zMIG_PU{I0ExE_RuJrK#UoMPawR6;@p23Z$Ro}_S{>b(VAyARKe9G627fwalans~@_ z*&}=e;)0o|%uIrKh?z>T1A@Q|DXGL<^uQ$?clogsM3#y`5?S|!G2*ovh=|+1WrHXQ zGjkB%Lv1|?q9}|w+JUk(X|DxZTqtNG4|FKJC?*V#!vbQmc+#faEWmd%Tm`2~4g$Dt zEX#360yfBKPbojyn^;(GL0@G+TFXBdZ7{(O|q|uccy)Z3!CcziV(K^3NU&~7o=h%sNRoRTt6D0Eo z$pWv1)~or3GwO96SY;g=6w-=NVVLZP;0cT7v-uqY!2UP*wTP(aEo%m$BS)Sbi1k>Q zKA$j7>?0$v>26oA(i3&K#d?rw0n5Yp3_JmjuV4Tz!Kw!+N#G5n4bog}8lKJQ^~DQj z@Z-;}41J2dg#kK(cB*17qNfay|U=xhN!NE3oEmr28XO08@9mNF0}-ii+i|r&$Nd_8qc%2YW#n??}Q#ra7YLJRbZ8QbC1X1s8aqCd^4A zj?`R*sutEMC@B25=`*~0f_yCi@v^mb`w1(mn^=YQnRc(Q-9?Ps9PkuV`+{)6N#Uhp z<@aYkYaF^yvw5b~tfaCHErz^wy#0#}DH`$`ii?YJhULh4Puwk6AIw5w7*;wuI*(wy zl7U2nl1taa!ZwppGMLD(a0p4w!CE3I4qTRWhsj7Y{1#ZQ5l9=7c@`Y)I?(tln16)b zp81U|7I;5^-`%_Pe zpvRg@v!DlF=tfH_sDJqm9@KkXaOw5>eGot8H8t-v&lVRSMnH!jQ>Pfb&s#=4+(baX zkcZHbC3v=kBRN>m1A-|7LAs^nXr|#Rv@K;pPn_O4#WKPUogDjkN{ zb~~0$+DqT+9LUHeD6z!8hDf%8qSBvuy@f1y)TZ_8*I&UpX7oHRf0@Ha*S=??$C`Tc zNfQ?n$YOkdV*)BLI(W;9rwwFJZg{1lLh?MqB18xbrE?a&NGD>rMK5*V6v(00S2DXV zd>TBzWEGZ%mi^zkZL^qD5jhz5W?1V!9ON7U@`VrtdHL=Bj#goQZXo?DGBjZOCa z3Zk)>j2@46k?#>;4|L9%!PW2x3T_~_;B6!pCQyb+cMc>vv*Rcao_>YSG5c3ZI5Ff5 zJUj#_xue=~nx8>6vuC{TsRffK1Rxw)1+8D=Fz!G> zCh%HwZ;qTUIt_W=#VD%h71^LyMX@%N2%8fx5s4Lf{QB+N+$%Sz>jm~gP9r5)dX2KPUPR9wEDxdkoN&c~3$E7Pe}RW{OD- zfAZvrU-Pc4+1XhGQyGE`f7I7+z;#W}%|(6x-2M$4SV=|2lY2h%H2zfpI`+4#WKX|= zVfZ}j)RYuQG}saS7x&LM(vX+}J>%>H)6#5sg%;${zutFJW@MK3+6~)@3^9`vUWjjS z00Lk*M*%yBl=A@!K3!TtMj5XTWJLbvL-Hvqa!#0R&akO5+;S6Ck07d$h+=Y^exL5U zwyF>78{)vg_wO4Ky&v;Q?=3s&?tUEdt1y|1_VB2|)CMBhWcG}V zx@?OS*g5! zDdivLci|Qmo(X*w^2z!54to?6I%-DQrQ9@qtHxq|v1d`tF=V(j* zp|P=oc|{^RCPuk6P4@=gABqOdxsvqo;Z0x*5xXv0$k`v_404>C+o{hZ%NwD3(jw<*Ng77BFV88me=D_~1ElLa#)Q4RhIN&$+_4+PQ1j zAh35kQ(%2V1Ba+612BX52u}pCEiMe3PSe1EoWwsaAu$ATFiw2BViYw~GvPeg-LHwl zp$$0Icm99idUF5kc&5%p(urO@Ehp#82B@EX1iF0?{6~EC3eb3Y{x-ThCU-Wm%Nd{b z2geSvVf+`e5BaYk*Bl)GFXpb`VoZ^8zXz#`%e@t(eE~711pM;M08j<_j!Ik?UXuSFa_`(iQ47AkEA0J+TvH^lMW?xU*mLrp-JcifcCaHcUm&#77Z*%%mod$CaUtn`vmy+uDXh)K7ssZeu+(G=z8&=ZY`TAe{bXQZAZI^_mv~Jtrt!#G447cI z5wu0Cz>5P-RZR8tg2}mKU>kfFK}}u^Sdp)Q_`hm9_rIR+{*S+NNamDbEFIZGO-|)> zRYFdMqJs`1(sa;_WGjba4z1)|4a>1Y`P9M(CDl-y8Yz8hn8UI}%_%ul;<`Uw|HAkC z+qK)JdLLfz*Yo*&oL;%FZv_t>o_6OFec0fhy?XsxR@R+_S^&|D5LuGPN<+fdy$~*! zX~ez6d)~aQbQ_8tysR`yasFJ)!Q|w2^imV)kLub*aPoIOxfOws%%C$4F{PLk9YSL2h>wNzp zZj`T|-;rT!VD}igr7MyNVSi`V#P8b|i$|VO?hwmL@5b(g1hQ2~Kz;nUBb<1kCyGuPJtt25xS!eiPx%oUxfC%{ zPeeKj)qKDs5!W@I{C2ot5w2W>{9dqh>HH@lO+d7Q+mgHT03<<35-<#rZN)uiYfC9z zi*&>{ARwCUm%ZEA#>RjfloSAmX1GnM1B3uGyo?qPaU;d z8X~2FyJUdwl0A2;Xl5idvdXZqsiVU6X_}hI4zp9K~UTg^22|WFMb= zO7_~;oXX)WAx0^5AnCazcnqoe!2i^|?xM(?gJ&A82XD?}i_y4wsfF~Y~hBYQ0*x3$Q9+ZVnMiA zR5aPokaR5xGRey2x#9q&-&}|cQ1CLda3=8N(|~h_*){b_SnNGePhIz*f8Kqq{%g62 zYrFD;S($C3-lAv~q3}ku2wvIjMUtm#)&yiEnNrHZSGNv6M^U7sTr4ehipb<8ctwKP z2>EVlSb`!jngL!_Z;ND^NQ;!BR!werDCxe3hutIfn74zkAeN>tAlKqNZc*HTL4UxX z&ICg}{>p6Ju}-(O#Xi0sFEdM75hJ5?J)>va*KZhg1|6zwCEZufLx@-3qQC z2}m+jEMGnxfaP1=MHz0P^opwiGzAGl-`9nCbZ-7y18%q{7z`=$4CVxv#Hl@>-{M_e_ zjgsQ++7QpU2B0J$EBoXyL=plKQ7_5&7=V`H=u0m+BuZ))qbVryLgG;#{gpj}Vy@ex z#}5on5)leXI-YRm%7mZAs4``%z8GV{3gYO5tiOM*DA-tkq(LC*s0~*r86y;7XJ_Xq z<~t$w1`V1PlEgcg{T->L@1jK;fWnT@CV~eDZ4dIejW|6DX4*e3&mup>qMw_fvyK7i z(!F~|h>XZslc*sw`pP>r61Ic-lx6gx_XpzW}{yEWlqfuiyI5?a( zJeA*{Mv;zgLtI=JxHuhPQA9O8AQP|=440rC(bxo)og!fzJW4dQasU7m?~QYJrFB81 zMKC`xPJVl#?W*}tRN6z4vuT4{Nva`L`4UjmdSXG}VIdA`BG37wLXdWdcX62xl`KTF zqz6F66L|;UV(n!n4g9JFtoJQ4hwJPa>iXs6@KU)pvL(jXH$V^%1B7JLmah=FPr_Ll z)u9d7!}x;b*=XJmusIt2nt|5y$iOVq!Qn(o^j0>|W4^`OU6BCKAIn2=%x~DuigL{N zzyO}E-a=5yARq9t$`wdGJ_X^V(~3rlm_C?JNq4Z97|I#&JzGMQ)C{ciGMkcHHBnkb8HtL#G6d*@MQxYc195@wtyV zZ}(0u-nQZ!*N_>`r^yMYD@AYO{@{He#jdislL-NK8?mTeKX)QED4h#t!2Fcm!>q)} zCgKZ{NX(UJ0Eu+fDlquj={^MC6rbb^cp;EyeO1NIvpD~czd9DQ)?@?RLcEvE??>g{ zOR49m8QDU3byR%pB$Z(N-jiU2yjMg;n_=rNf*_zV>eyVIxsZ<=ZPh>%S7JE3a70-CnG);rs39`EQw{v=fz&iQFxYY8QZ z_eV#%{aQZOu5_QXCB?-e_-gMQKHyMYlJXJ8<<5^MMM|ny0(n$k{x^ZZ$pIrKgXeZ= z*?Fs^vyIQ(2AmCMyS7lGk!S?Xc**{$bFd*{N5kf0XMV_~Tue0@83GjFFRJ)Ud7s@VII+{N8(q|JU~v>77ePM#z&|Bt9BZYdsr7in&qRerVm zA6(z*)Z-!Q&;Mz~eWv$v>FqN!6kU>og61!e@jX&!>oRcQ!0mZoq-%$R9b6=6S~@rwot~Si|IbxW?%?;#I-e-jH=M?4_NJyGkazL=PGdAUXEg|4`KyWEx)MyG z<$6~;vpFET-|xXtBf#f3e)_=fu&bCb@v@&%!3-l7Eu!r#Z;4rRQ-Z&ix`a5l3zx19 zxHz%MGN%3|K)UM8^r~*h1ghsLY1yrQd3BUo$?hL=$>Iv=k^rfI`VU9&2hgo#vSCGVLRzkw`S4uQ`9|yl|dpDam zch%y>p*kyy^s<#J5NT|fZaNW04g<*h>2*8N@t}I2bKZiJBW5q&khXhiq-)CecCBo5 z$f=fGHJ>|?j1N7dy$M$qm0v1kv6r5Bhl)OM^*wxP&9{lBSghysDj48~KpEAtn-nH3 z*Oive`oYTRmH+kuG?Xb*!KRI zU@mB@poJIHgQmExo!*I6B3eq?wYv$F^jNM&^+d0XPyM%>F zoxtHA0jh1s2WA*hc3r}EPtMBh&_yp<9l9Ytz88F=mR(KGkrR9#Ls9gtnqL*>x$H#G zQ?0r-S3;lp^zG53ZT8%*iqv)jBhsu?v|A32jznansy7FRX#6P~;;yMYjrv`>EgURG zH58namAMkVK`gG!_%y`l&Y!=;#Au9Z34419zg#0ho1W6=7k8_>G4yzNQbxr3JqMcYPTLg#f$Le;TR<^5fEEa`=()5tU|I z-$L8)^6?QJ^%UA)YQSiLLysFE%CY3H1NQY7{9lKG+7gz zZ0Fx8>5ThW|63UbRyV&9kR1RB$%n1Qyj%b{9mWh_(Ou!%=H)|`G*{FPe4JTp_|Kro zJ@YR_xYdnGkIjhn4$*u`N((@?RYu9K^*fNU{|$mJp2!uqN5Wyt{KbXKIXTcAm+stY zeLV8;*2jCty$vs0d4A^Kd>3sFM$B^4Z((P23x4k!^4r<5;~&8R%djJ}59lF);zeGA zKol$jIeVvERZv^wX)vnL_Ol7bqejgMHjk|fBg%FzIl91m=Q)mm^r5niD36UiW3&Vh4JYXecDU=QjqoJn%>7x;qi z=YMD&!j2AwE^#JFO<_L&*}W~X8czGCf`S4C4oVnte5waLe!G?Das!e=mJhLb<>7s4 zG?CAUGrv6CJL%a7()nzDcd-m_8{gZ}=Z7fUXF1lf-WT0~J^KiQ4oaY<$PJ<_mAQmX z!w<(%X>M1|A?xi&&m^=jR5j+L1|I9QkwPkmQAHK2rW9s5O`m?E@?f6&5Z`LRjnpnQ z!JC;EkU!|i#R)*wt5-_c{pzDBqgOIk=}rjf+?80h`R4v^Db|0?z;#w>>~wpWi+&>G zDACaOk897&7{nwwec#9~Le+zWfrbwCD-s4{0j1~r53O&s-aUK$3_s8QAc??~PA+`^ zXT5q&JNxEzmtM(^{M-&OJ2u+{efe8gtx@dD-!@?L+0oR$H{YTlbuGWe4E z(H|?E_n9TXEVi6E*Y2HpZyaj$#$=RL$xS`!OXQ0=-Wf`ihTE?10ob(s>G>F8!yrht1Vpq zY6!WPcfq0LXtnj9%$g(m-fj#O`VVq+wqt#4#EC~u>ASLnMIWXVuxwJg?HtKg?zYOQ z`xjF^z;Fg zob6P`dU8}9D<%_p;Hv^vG1=?H6L(O)@;qr@`_g|xv|glX*qV;+uC7yGxxb&@m2sL^ zuQ=ayNFMx?*^nWLV^?U&n*fO-d3X!{c=y3;n9glm{vDy%u|=d?CAqs12WHQ(j7lOF zX7KU57d)dQ%k%DCST!f)`Pcq2hWq!9^%X+3v^3Leo3*t$-P0xvTHx`|@2+~LrA*$c ze_TD_)bK*pqcq8y34Y4obWM;$ySNRW>?JayUH4B@nF;^CDRbnbu}c9IS^QddFS8Cu z9`!o!vx+nFl5FClisv6gzl-;;D-UQBDzDCl);M7QC}0L+29IIz3*7w*AoECavi;u0 z&f?samLcIQ&-H9@*xU3O9H-bKA@~vw60w_rHT=!>OAkU+O%}&| zh-}bk_48j{H1+%+5-pAbR-{l6v>k;GB3hm`B_Yx}Cij85hnEg^zS-Yp*}nwQ)el(t z+!@+w6OfW*){6HQIg>O<)COZfAAuD?nD)Qj;xS_|@q%KL0#TDjToh7-unG3Fk`zbI z#w#GV3>Bc>OH2{^R3&*!q88vzeL-%;CFSY)xy1F#fev@hiU^7P;WW9Qks_4&5w^xb##=@zwF#HKT(OX-Haig-FL~7E#d;2-0~Of0}v#q zto4xKI^fq1(vx6vWjl&NumnZ@fL}n+wl2#3>zqWS6mWNvPbLwt^mX(iDPs+vCdFZZcuDfw`n}co5uiH85(Mi=Zb=ax(XA(() zFPc>~V)*c6OH_nD>aClH*JKB)XLTNF4U($%2V1CL{VVGGYQ!oUz0PB-t>^mP1pk}8 zm!}*T*zQRpD8jmaJV`CkE+AwG+?rZzTYPPXCiRzJp8t5D zqcD>c1kWwcCLk_F-8lr9Hd)IpJ&*V2s@O0j)`kC2lXM`@;8yE{AYKmU3f_R=9D>%AP}Vrcyi`*ziyyKHHH>>K42@{pj{*@0be z(xkrqF)ZC7{Ha$+-n#}ztw)AS=INMV2{!l1x3RWfk?LmHxrzQlh-SUBw>j4D!SvCe z@O}2+I>x?9ijR-Kb-$uGv?}PxPdifTlxBFha!)b@nq0b6%xHEp-LUn{!yx!~C$&-a zH+Zb&P@{%+nZOY1(BhhhTN!Fo5k?k8*%&cj6#Le!!W&_?? zY4Rxsi!E&2CZk99`R?go9Ox3TFj#4V=xTMUm{m(U=wltG~e8|b+0W0;gf zJ($!kLd~QOyGl#2j1~sZ*Rd@lQj9kgFxCm8PD>|&R_o869VM22!4#N9KzgLDb=> zZCc0544+O4_L!4J9UiedPhT5yLXK$_U_lPN1T#!O`7gMyoT(sZvp}Uu@+6M1z8sed zZroO!qhJc(n5Yur20^_sp{KCENP~P^-SfsqSM0e zfO|`yj)aQfBFQo2L#HlvhOUt;PRrM+60HCbZJ|~)_OoVnU)%h6Ks#-1IU9vn^(#Ds zB%l$@q%*Fyv4`S|;=}C1U(Yy9mM!_P_+bf=DGKWil?n9M&Uws`W2yUBqmdQ~E-<9C zhljMCNKEwsA>{lizzcyrNkH(fAGu-UMhP8}j4&qF1)T8Ep+g5T!SLfj-SQTH{k7Bx zB}$GU3GU>uV1Wt4jez{LsB-EpGBnxZAzAM~dzKmc`>w->`+@Yd1>6?p!n$=@`UVDN zP(X6PX?>qHB94+XWl?VPFR7Pw8HPU%_m8RcCc`I$yew^Ci__PBNc$INmcFdFq@hA| zP^;xMHkd!jOvNRf-mnFs@#m6U@-u=hb|C&BWTlCmn+y3aB z9lD(0fWI!R>Wvy*4xO+{%|-_WL(+{c<*`MaDI~i%!Z_%Yq3X!1-1cVPfA%_%P4$ut zRWY^FB5q`=hyOl^#0>&3r}9uzPj-_ie0C3XO!8cqCCc#r%BiCv-_%f8dkIfN zOhd(9FO94tIsnk1^gph8GdIbB7@IaZ)P_(3q=!LVLqj&sEq&bMe6%fPr|9AI-`)Gr zY6Mx6`eM(Bawkz)ojf@K0rofd@>F4V3lHZYuo(UoWt-z>kG}|cc?!5u#99B#;GWwwfM|!it>54Lh8e17? z!#D}*(O0>Cv!6rb(l6BgCE^=MGP5LS`==)DWLuNd!T7LF)Yn}PWy9G_@17P`WE`>M z54uEVWv8F7Jn)1nn#6iTi=M^V+D!i9;|66f3(f3Q7W;2@w@uSEsO%ZYkL6@&Yt{+R zUz?k5KV&^8?^Jl+{+GWuvKtujYDC1aSWa+PrcIh@ KpE1FA{eJ-|l+%p> literal 32144 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 diff --git a/img/regexp-es.png b/img/regexp-es.png index 3efa6eed322c852ffb7689b108d34aa0a844c76b..b8a76240fc38d2f8eff583137b74ca7ebdc34913 100644 GIT binary patch literal 34485 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

4q4jOSUh9DW+{=OZi@ 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 V9^=zzfx;gX$4xbh8#8C!e*tc?^nw5Y literal 34234 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 literal 32922 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ⅲOo}+zjETXvtEYZiOJMqI{EuGG!0^ z9;hWbp;Nf*`(+q)1C^44(yL$?W1AiM3;;0a7rGH*9VRBepaVBpeuEj|L+?#wZONme z-RFZrquxo9IKg?8C@$_eAa(0~d_*&+Umf7@FB(ATo~Bei@`t&>OgCf+20Y*7?BemB zGigUt9y`zK2m(d3@q?*pdxA2Gw(GoGQ=j?f=H`}#QJ0^Ti$0rJC2J^tr;a+#b;o`@ zja^axfM~_MXZBY4XV2CpZpg0S;PSAmqS6C7l93_{$_57~7O+y##-4<8mA#Lt#rDjr#8rK=PA3orqKn+Fr0ypml15ow?a^`io_EZTx1ra9*Vy)!ta_3bt3;*?RW>BRYI;dCejT)%00%cIeKBsfK9VddmV{PCT@;P1mt{ z3GUW9@|}c38qFDq~mR*HpX>ApJGPmMQA}kgTevkLJ!17I zoQp*Shs66#JLgvI{;K~kY0E{SbVD!tumAl&1!Dih)SUkhY1;quZ*CYf%2SJ R%nHS{Ni!$LjsN-g{{YNvA{YPw diff --git a/img/regexp.svg b/img/regexp.svg index f08690b..50ea7c7 100644 --- a/img/regexp.svg +++ b/img/regexp.svg @@ -17,7 +17,7 @@ version="1.1" inkscape:version="0.91 r13725" sodipodi:docname="regexp.svg" - inkscape:export-filename="/home/nbo/dev/learn-regex/img/regexp-fr.png" + inkscape:export-filename="/home/nbo/dev/learn-regex/img/regexp-es.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90"> + inkscape:window-maximized="1" /> <metadata id="metadata7"> <rdf:RDF> @@ -216,7 +216,7 @@ id="tspan4268" x="171.65625" y="204.00377" - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:30.00000191px;font-family:monospace;-inkscape-font-specification:'monospace Bold'">^[a-z0-9_-]{3,15]$</tspan></text> + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:30.00000191px;font-family:monospace;-inkscape-font-specification:'monospace Bold'">^[a-z0-9_-]{3,15}$</tspan></text> </g> </g> </g> @@ -304,7 +304,7 @@ y="204.00377" x="171.65625" id="tspan4253" - sodipodi:role="line">^[a-z0-9_-]{3,15]$</tspan></text> + sodipodi:role="line">^[a-z0-9_-]{3,15}$</tspan></text> </g> </g> </g> @@ -390,7 +390,7 @@ y="204.00377" x="171.65625" id="tspan4302" - sodipodi:role="line">^[a-z0-9_-]{3,15]$</tspan></text> + sodipodi:role="line">^[a-z0-9_-]{3,15}$</tspan></text> </g> </g> </g> From cb21fb6ffcac31b88120af264f26a0dbde172c66 Mon Sep 17 00:00:00 2001 From: Gabriel Prates <gabsprates@gmail.com> Date: Mon, 21 Aug 2017 08:48:17 -0300 Subject: [PATCH 27/36] Portuguese Translation (#51) * starting translate * add link to pt_BR * translating... * Intro: ok * translating titles * title links * translating 'basic matches' * translating 'meta characters' * metacharacters' session finished * repetitions' session finished * braces' session finished * character group' session finished * details * alternation' session finished * escaping special character' session finished * shorthands' session finished * anchors' session finished * license and contribution * lookarounds' session finished * readme details * lookarounds' session finished * update image link --- README-pt_BR.md | 410 ++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 1 + 2 files changed, 411 insertions(+) create mode 100644 README-pt_BR.md diff --git a/README-pt_BR.md b/README-pt_BR.md new file mode 100644 index 0000000..4f1e1d8 --- /dev/null +++ b/README-pt_BR.md @@ -0,0 +1,410 @@ +<br/> +<p align="center"> +<img src="https://i.imgur.com/bYwl7Vf.png" alt="Learn Regex"> +</p><br/> + +## Traduções: + +* [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) + +## O que é uma Expressão Regular? + +> Expressão Regular é um grupo de caracteres ou símbolos utilizado para encontrar um padrão específico a partir de um texto. + +Uma expressão regular é um padrão que é comparado com uma cadeia de caracteres da esquerda para a direita. A expressão "Expressão regular" é longa e difícil de falar, você geralmente vai encontrar o termo abreviado como "regex" ou "regexp". Expressões regulares são usadas para substituir um texto dentro de uma string, validar formulários, extrair uma parte de uma string baseada em um padrão encontrado e muito mais. + +Imagine que você está escrevendo uma aplicação e quer colocar regras para quando um usuário escolher seu username. Nós queremos permitir que o username contenha letras, números, underlines e hífens. Nós também queremos limitar o número de caracteres para não ficar muito feio. Então usamos a seguinte expressão regular para validar o username: + +<br/><br/> +<p align="center"> +<img src="http://i.imgur.com/8UaOzpq.png" alt="Regular expression"> +</p> + +A expressão regular acima aceita as strings `john_doe`, `jo-hn_doe` e `john12_as`. Ela não aceita `Jo` porque essa string contém letras maiúsculas e também é muito curta. + +## Sumário + +- [Combinações Básicas](#1-combinações-básicas) +- [Metacaracteres](#2-metacaracteres) + - [Ponto final](#21-ponto-final) + - [Conjunto de caracteres](#22-conjunto-de-caracteres) + - [Conjunto de caracteres negados](#221-conjunto-de-caracteres-negados) + - [Repetições](#23-repetições) + - [O Asterisco](#231-o-asterisco) + - [O Sinal de Adição](#232-o-sinal-de-adição) + - [O Ponto de Interrogação](#233-o-ponto-de-interrogação) + - [Chaves](#24-chaves) + - [Grupo de Caracteres](#25-grupo-de-caracteres) + - [Alternância](#26-alternância) + - [Escapando Caracteres Especiais](#27-escapando-caracteres-especiais) + - [Âncoras](#28-Âncoras) + - [Acento Circunflexo](#281-acento-circunflexo) + - [Sinal de Dólar](#282-sinal-de-dólar) +- [Forma Abreviada de Conjunto de Caracteres](#3-forma-abreviada-de-conjunto-de-caracteres) +- [Olhar ao Redor](#4-olhar-ao-redor) + - [Lookahead Positivo](#41-lookahead-positivo) + - [Lookahead Negativo](#42-lookahead-negativo) + - [Lookbehind Positivo](#43-lookbehind-positivo) + - [Lookbehind Negativo](#44-lookbehind-negativo) +- [Flags](#5-flags) + - [Indiferente à Maiúsculas](#51-indiferente-à-maiúsculas) + - [Busca Global](#52-busca-global) + - [Multilinhas](#53-multilinhas) + +## 1. Combinações Básicas + +Uma expressão regular é apenas um padrão de caracteres que usamos para fazer busca em um texto. Por exemplo, a expressão regular `the` significa: a letra `t`, seguida da letra `h`, seguida da letra `e`. + +<pre> +"the" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat. +</pre> + +[Teste a RegExp](https://regex101.com/r/dmRygT/1) + +A expressão regular `123` corresponde a string `123`. A expressão regular é comparada com uma string de entrada, comparando cada caractere da expressão regular para cada caractere da string de entrada, um após o outro. Expressões regulares são normalmente case-sensitive (sensíveis à maiúsculas), então a expressão regular `The` não vai bater com a string `the`. + +<pre> +"The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. +</pre> + +[Teste a RegExp](https://regex101.com/r/1paXsy/1) + +## 2. Metacaracteres + +Metacaracteres são elementos fundamentais das expressões regulares. Metacaracteres não representam a si mesmos mas, ao invés disso, são interpretados de uma forma especial. Alguns metacaracteres tem um significado especial e são escritos dentro de colchetes. +Os metacaracteres são os seguintes: + +|Metacaracter|Descrição| +|:----:|----| +|.|Corresponde a qualquer caractere, exceto uma quebra de linha| +|[ ]|Classe de caracteres. Corresponde a qualquer caractere contido dentro dos colchetes.| +|[^ ]|Classe de caracteres negada. Corresponde a qualquer caractere que não está contido dentro dos colchetes.| +|*|Corresponde à 0 ou mais repetições do símbolo anterior.| +|+|Corresponde à 1 ou mais repetições do símbolo anterior.| +|?|Faz com que o símbolo anterior seja opcional.| +|{n,m}|Chaves. Corresponde à no mínimo "n" mas não mais que "m" repetições do símbolo anterior.| +|(xyz)|Grupo de caracteres. Corresponde aos caracteres xyz nesta exata ordem.| +|||Alternância. Corresponde os caracteres antes ou os caracteres depois do símbolo| +|\|Escapa o próximo caractere. Isso permite você utilizar os caracteres reservados <code>[ ] ( ) { } . * + ? ^ $ \ |</code>| +|^|Corresponde ao início da entrada.| +|$|Corresponde ao final da entrada.| + +## 2.1 Ponto final + +O ponto final `.` é um simples exemplo de metacaracteres. O metacaractere `.` corresponde à qualquer caractere sozinho. Ele não se iguala ao Enter e à quebra de linha. Por exemplo, a expressão regular `.ar` significa: qualquer caractere, seguido da letra `a`, seguida da letra `r`. + +<pre> +".ar" => The <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age. +</pre> + +[Teste a RegExp](https://regex101.com/r/xc9GkU/1) + +## 2.2 Conjunto de caracteres + +Conjuntos de caracteres também são chamados de classes de caracteres. Utilizamos colchetes para especificar conjuntos de caracteres. Use um hífen dentro de um conjunto de caracteres para especificar o intervalo de caracteres. A ordem dos caracteres dentro dos colchetes não faz diferença. Por exemplo, a expressão regular `[Tt]he` significa: um caractere maiúsculo `T` ou minúsculo `t`, seguido da letra `h`, seguida da letra `e`. + +<pre> +"[Tt]he" => <a href="#learn-regex"><strong>The</strong></a> car parked in <a href="#learn-regex"><strong>the</strong></a> garage. +</pre> + +[Teste a RegExp](https://regex101.com/r/2ITLQ4/1) + +No entanto, um ponto final dentro de um conjunto de caracteres, significa apenas um ponto final. A expressão regular `ar[.]` significa: o caractere minúsculo `a`, seguido da letra `r`, seguida pelo caractere de ponto final `.`. + +<pre> +"ar[.]" => A garage is a good place to park a c<a href="#learn-regex"><strong>ar.</strong></a> +</pre> + +[Teste a RegExp](https://regex101.com/r/wL3xtE/1) + +### 2.2.1 Conjunto de caracteres negados + +No geral, o símbolo do circunflexo representa o início da string, mas quando está logo após o colchete de abertura, ele faz a negação do conjunto de caracteres. Por exemplo, a expressão regular `[^c]ar` significa: qualquer caractere com exceção do `c`, seguido pelo caractere `a`, seguido da letra `r`. + +<pre> +"[^c]ar" => The car <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age. +</pre> + +[Teste a RegExp](https://regex101.com/r/nNNlq3/1) + +## 2.3 Repetições + +Seguindo os metacaracteres `+`, `*` ou `?` são utilizados para especificar quantas vezes um sub-padrão pode ocorrer. Esses metacaracteres atuam de formas diferentes em diferentes situações. + +### 2.3.1 O Asterisco + +O símbolo `*` corresponde à zero ou mais repetições do padrão antecedente. A expressão regular `a*` significa: zero ou mais repetições do caractere minúsculo precedente `a`. Mas se o asterisco aparecer depois de um conjunto de caracteres, ou classe de caracteres, ele irá procurar as repetições de todo o conjunto. Por exemplo, a expressão regular `[a-z]*` significa: qualquer quantidade de letras minúsculas numa linha. + +<pre> +"[a-z]*" => T<a href="#learn-regex"><strong>he</strong></a> <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>parked</strong></a> <a href="#learn-regex"><strong>in</strong></a> <a href="#learn-regex"><strong>the</strong></a> <a href="#learn-regex"><strong>garage</strong></a> #21. +</pre> + +[Teste a RegExp](https://regex101.com/r/7m8me5/1) + +O símbolo `*` pode ser usado junto do metacaractere `.` para encontrar qualquer string de caracteres `.*`. O símbolo `*` pode ser usado com o caractere de espaço em branco `\s` para encontrar uma string de caracteres em branco. Por exemplo, a expressão `\s*cat\s*` significa: zero ou mais espaços, seguidos do caractere minúsculo `c`, seguido do caractere minúsculo `a`, seguido do caractere minúsculo `t`, seguido de zero ou mais espaços. + +<pre> +"\s*cat\s*" => The fat<a href="#learn-regex"><strong> cat </strong></a>sat on the <a href="#learn-regex">con<strong>cat</strong>enation</a>. +</pre> + +[Teste a RegExp](https://regex101.com/r/gGrwuz/1) + +### 2.3.2 O Sinal de Adição + +O símbolo `+` corresponde à uma ou mais repetições do caractere anterior. Por exemplo, a expressão regular `c.+t` significa: a letra minúscula `c`, seguida por pelo menos um caractere, seguido do caractere minúsculo `t`. + +<pre> +"c.+t" => The fat <a href="#learn-regex"><strong>cat sat on the mat</strong></a>. +</pre> + +[Teste a RegExp](https://regex101.com/r/Dzf9Aa/1) + +### 2.3.3 O Ponto de Interrogação + +Em expressões regulares, o metacaractere `?` faz o caractere anterior ser opcional. Esse símbolo corresponde à zero ou uma ocorrência do caractere anterior. Por exemplo, a expressão regular `[T]?he` significa: A letra maiúsculo `T` opcional, seguida do caractere minúsculo `h`, seguido do caractere minúsculo `e`. + +<pre> +"[T]he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage. +</pre> + +[Teste a RegExp](https://regex101.com/r/cIg9zm/1) + +<pre> +"[T]?he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in t<a href="#learn-regex"><strong>he</strong></a> garage. +</pre> + +[Teste a RegExp](https://regex101.com/r/kPpO2x/1) + +## 2.4 Chaves + +Em expressões regulares, chaves, que também são chamadas de quantificadores, são utilizadas para especificar o número de vezes que o caractere, ou um grupo de caracteres, pode se repetir. Por exemplo, a expressão regular `[0-9]{2,3}` significa: Encontre no mínimo 2 dígitos, mas não mais que 3 (caracteres no intervalo de 0 à 9). + +<pre> +"[0-9]{2,3}" => The number was 9.<a href="#learn-regex"><strong>999</strong></a>7 but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0. +</pre> + +[Teste a RegExp](https://regex101.com/r/juM86s/1) + +Nós podemos retirar o segundo número. Por exemplo, a expressão regular `[0-9]{2,}` significa: Encontre 2 ou mais dígitos. Se removermos a vírgula a expressão regular `[0-9]{3}` significa: Encontre exatamente 3 dígitos. + +<pre> +"[0-9]{2,}" => The number was 9.<a href="#learn-regex"><strong>9997</strong></a> but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0. +</pre> + +[Teste a RegExp](https://regex101.com/r/Gdy4w5/1) + +<pre> +"[0-9]{3}" => The number was 9.<a href="#learn-regex"><strong>999</strong></a>7 but we rounded it off to 10.0. +</pre> + +[Teste a RegExp](https://regex101.com/r/Sivu30/1) + +## 2.5 Grupo de Caracteres + +Grupo de caracteres é um grupo de sub-padrão que é escrito dentro de parênteses `(...)`. Como falamos antes, se colocaramos um quantificador depois de um caractere, ele irá repetir o caractere anterior. Mas se colocarmos um quantificador depois de um grupo de caracteres, ele irá repetir todo o conjunto. Por exemplo, a expressão regular `(ab)*` corresponde à zero ou mais repetições dos caracteres "ab". Nós também podemos usar o metacaractere de alternância `|` dentro de um grupo de caracteres. Por exemplo, a expressão regular `(c|g|p)ar` significa: caractere minúsculo `c`, `g` ou `p`, seguido do caractere `a`, seguido do caractere `r`. + +<pre> +"(c|g|p)ar" => The <a href="#learn-regex"><strong>car</strong></a> is <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age. +</pre> + +[Teste a RegExp](https://regex101.com/r/tUxrBG/1) + +## 2.6 Alternância + +Em expressões regulares, a barra vertical `|` é usada para definir alternância. Alternância é como uma condição entre múltiplas expressões. Agora, você pode estar pensando que um conjunto de caracteres e a alternância funcionam da mesma forma. Mas a grande diferença entre eles é que o conjunto de caracteres trabalha no nível de caracteres, enquanto a alternância trabalha no nível das expressões. Por exemplo, a expressão regular `(T|t)he|car` significa: o caractere maiúsculo `T` ou minúsculo `t`, seguido do caractere minúsculo `h`, seguido do caractere minúsculo `e` ou o caractere minúsculo `c`, seguido do caractere minúsculo `a`, seguido do caractere minúsculo `r`. + +<pre> +"(T|t)he|car" => <a href="#learn-regex"><strong>The</strong></a> <a href="#learn-regex"><strong>car</strong></a> is parked in <a href="#learn-regex"><strong>the</strong></a> garage. +</pre> + +[Teste a RegExp](https://regex101.com/r/fBXyX0/1) + +## 2.7 Escapando Caracteres Especiais + +Em expressões regulares, a contrabarra `\` é usada para escapar o próximo caractere. Isso possibilita especificar um símbolo como um caractere correspondente, incluindo os caracteres reservados `{ } [ ] / \ + * . $ ^ | ?`. Para usar um caractere especial como um caractere correspondente, utilize `\` antes dele. Por exemplo, a expressão regular `.` é usada para encontrar qualquer caractere, exceto nova linha. Agora, para encontrar `.` em uma string de entrada, a expressão regular `(f|c|m)at\.?` significa: letra minúscula `f`, `c` ou `m`, seguida do caractere minúsculo `a`, seguido da letra minúscula `t`, seguida do caractere `.` opcional. + +<pre> +"(f|c|m)at\.?" => The <a href="#learn-regex"><strong>fat</strong></a> <a href="#learn-regex"><strong>cat</strong></a> sat on the <a href="#learn-regex"><strong>mat.</strong></a> +</pre> + +[Teste a RegExp](https://regex101.com/r/DOc5Nu/1) + +## 2.8 Âncoras + +Em empressões regulares, usamos âncoras para verificar se o caractere encontrado está no início ou no final da string de entrada. As âncoras podem ser de dois tipos: O primeiro tipo é o Acento Circunflexo `^`, que verifica se o caractere encontrado está no início da string de entrada, e o segundo tipo é o Sinal de Dólar `$`, que verifica se o caractere encontrado é o último caractere da string. + +### 2.8.1 Acento Circunflexo + +O símbolo do Acento Circunflexo `^` é usado para verificar se o caractere encontrado é o primeiro caractere da string de entrada. Se aplicarmos a seguinte expressão regular `^a` (se a é o primeiro caractere) à string de entrada `abc`, ela encontra o `a`. Mas se nós aplicarmos a expressão regular `^b` na mesma string, ela não encontrará nada. Isso acontece porque, na string `abc`, "b" não é o caractere inicial. Vamos dar uma olhada em outra expressão regular, `^(T|t)he` que significa: o caractere maiúsculo `T` ou o caractere minúsculo `t` que é o primeiro símbolo da string de entrada, seguido do caractere minúsculo `h`, seguido do caractere minúsculo `e`. + +<pre> +"(T|t)he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in <a href="#learn-regex"><strong>the</strong></a> garage. +</pre> + +[Teste a RegExp](https://regex101.com/r/5ljjgB/1) + +<pre> +"^(T|t)he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage. +</pre> + +[Teste a RegExp](https://regex101.com/r/jXrKne/1) + +### 2.8.2 Sinal de Dólar + +O símbolo do Sinal de Dólar `$` é usado para verificar se o caractere encontrado é o último caractere da string de entrada. Por exemplo, a expressão regular `(at\.)$` significa: um caractere minúsculo `a`, seguido do caractere minúsculo `t`, seguido de um ponto final `.` e o grupo deve estar no final da string. + +<pre> +"(at\.)" => The fat c<a href="#learn-regex"><strong>at.</strong></a> s<a href="#learn-regex"><strong>at.</strong></a> on the m<a href="#learn-regex"><strong>at.</strong></a> +</pre> + +[Teste a RegExp](https://regex101.com/r/y4Au4D/1) + +<pre> +"(at\.)$" => The fat cat. sat. on the m<a href="#learn-regex"><strong>at.</strong></a> +</pre> + +[Teste a RegExp](https://regex101.com/r/t0AkOd/1) + +## 3. Forma Abreviada de Conjunto de Caracteres + +As expressões regulares fornecem abreviações para conjuntos de caracteres comumente usados, que oferecem atalhos convenientes para expressões regulares comumente usadas. As abreviações são as seguintes: + +|Abreviação|Descrição| +|:----:|----| +|.|Qualquer caractere, exceto nova linha| +|\w|Corresponde à caracteres alfanuméricos: `[a-zA-Z0-9_]`| +|\W|Corresponde à caracteres não alfanuméricos: `[^\w]`| +|\d|Corresponde à dígitos: `[0-9]`| +|\D|Corresponde à não dígitos: `[^\d]`| +|\s|Corresponde à caracteres de espaços em branco: `[\t\n\f\r\p{Z}]`| +|\S|Corresponde à caracteres de espaços não em branco: `[^\s]`| + +## 4. Olhar ao Redor + +Lookbehind (olhar atrás) e lookahead (olhar à frente), às vezes conhecidos como lookarounds (olhar ao redor), são tipos específicos de ***grupo de não captura*** (utilizado para encontrar um padrão, mas não incluí-lo na lista de ocorrêncoas). Lookarounds são usados quando temos a condição de que determinado padrão seja precedido ou seguido de outro padrão. Por exemplo, queremos capturar todos os números precedidos do caractere `$` da seguinte string de entrada: `$4.44 and $10.88`. Vamos usar a seguinte expressão regular `(?<=\$)[0-9\.]*` que significa: procure todos os números que contêm o caractere `.` e são precedidos pelo caractere `$`. À seguir estão os lookarounds que são utilizados em expressões regulares: + +|Símbolo|Descrição| +|:----:|----| +|?=|Lookahead Positivo| +|?!|Lookahead Negativo| +|?<=|Lookbehind Positivo| +|?<!|Lookbehind Negativo| + +### 4.1 Lookahead Positivo + +O lookahead positivo impõe que a primeira parte da expressão deve ser seguida pela expressão lookahead. A combinação retornada contém apenas o texto que encontrado pela primeira parte da expressão. Para definir um lookahead positivo, deve-se usar parênteses. Dentro desses parênteses, é usado um ponto de interrogação seguido de um sinal de igual, dessa forma: `(?=...)`. Expressões lookahead são escritas depois do sinal de igual dentro do parênteses. Por exemplo, a expressão regular `[T|t]he(?=\sfat)` significa: encontre a letra minúscula `t` ou a letra maiúscula `T`, seguida da letra `h`, seguida da letra `e`. Entre parênteses, nós definimos o lookahead positivo que diz para o motor de expressões regulares para encontrar `The` ou `the` que são seguidos pela palavra `fat`. + +<pre> +"[T|t]he(?=\sfat)" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. +</pre> + +[Teste a RegExp](https://regex101.com/r/IDDARt/1) + +### 4.2 Lookahead Negativo + +O lookahead negativo é usado quando nós precisamos encontrar todas as ocorrências da string de entrada que não são seguidas por um determinado padrão. O lookahead negativo é definido da mesma forma que definimos o lookahead positivo, mas a única diferença é que, no lugar do sinal de igual `=`, usamos o caractere de negação `!`, ex.: `(?!...)`. Vamos dar uma olhada na seguinte expressão regular `[T|t]he(?!\sfat)`, que significa: obtenha as palavras `The` ou `the` da string de entrada que não são seguidas pela palavra `fat`, precedida de um caractere de espaço. + +<pre> +"[T|t]he(?!\sfat)" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat. +</pre> + +[Teste a RegExp](https://regex101.com/r/V32Npg/1) + +### 4.3 Lookbehind Positivo + +Lookbehind positivo é usado para encontrar todas as ocorrências que são precedidas por um padrão específico. O lookbehind positivo é indicado por `(?<=...)`. Por exemplo, a expressão regular `(?<=[T|t]he\s)(fat|mat)` significa: obtenha todas as palavras `fat` ou `mat` da string de entrada, que estão depois das palavras `The` ou `the`. + +<pre> +"(?<=[T|t]he\s)(fat|mat)" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the <a href="#learn-regex"><strong>mat</strong></a>. +</pre> + +[Teste a RegExp](https://regex101.com/r/avH165/1) + +### 4.4 Lookbehind Negativo + +Lookbehind negativo é usado para encontrar todas as ocorrências que não são precedidas por um padrão específico. O lookbehind negativo é indicado por `(?<!...)`. Por exemplo, a expressão regular `(?<!(T|t)he\s)(cat)` significa: obtenha todas as palavras `cat` da string de entrada, que não estão depois das palavras `The` ou `the`. + +<pre> +"(?<![T|t]he\s)(cat)" => The cat sat on <a href="#learn-regex"><strong>cat</strong></a>. +</pre> + +[Teste a RegExp](https://regex101.com/r/8Efx5G/1) + +## 5. Flags + +Flags (sinalizadores) também são chamados de modificadores, porque eles modificam o resultado da expressão regular. Essas flags podem ser usadas em qualquer ordem ou combinação, e são uma parte integrante da RegExp. + +|Flag|Descrição| +|:----:|----| +|i|Case insensitive: Define que o padrão será case-insensitive.| +|g|Busca global: Procura o padrão em toda a string de entrada.| +|m|Multilinhas: Os metacaracteres de âncora funcionam em cada linha.| + +### 5.1 Indiferente à Maiúsculas + +O modificador `i` é usado para tornar o padrão case-insensitive. Por exemplo, a expressão regular `/The/gi` significa: a letra maiúscula `T`, seguida do caractere minúsculo `h`, seguido do caractere `e`. E ao final da expressão regular, a flag `i` diz ao motor de expressões regulares para ignorar maiúsculas e minúsculas. Como você pode ver, nós também determinamos a flag `g` porque queremos procurar o padrão em toda a string de entrada. + +<pre> +"The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. +</pre> + +[Teste a RegExp](https://regex101.com/r/dpQyf9/1) + +<pre> +"/The/gi" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat. +</pre> + +[Teste a RegExp](https://regex101.com/r/ahfiuh/1) + +### 5.2 Busca Global + +O modificador `g` é usado para realizar uma busca global (encontrar todas as ocorrências sem parar na primeira encontrada). Por exemplo, a expressão regular `/.(at)/g` significa: qualquer caractere, exceto nova linha, seguido do caractere minúsculo `a`, seguido do caractere minúsculo `t`. Por causa da flag `g` no final da expressão regular, agora ela vai encontrar todas as ocorrências em toda a string de entrada. + +<pre> +"/.(at)/" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the mat. +</pre> + +[Teste a RegExp](https://regex101.com/r/jnk6gM/1) + +<pre> +"/.(at)/g" => The <a href="#learn-regex"><strong>fat</strong></a> <a href="#learn-regex"><strong>cat</strong></a> <a href="#learn-regex"><strong>sat</strong></a> on the <a href="#learn-regex"><strong>mat</strong></a>. +</pre> + +[Teste a RegExp](https://regex101.com/r/dO1nef/1) + +### 5.3 Multilinhas + +O modificador `m` é usado para realizar uma busca em várias linhas. Como falamos antes, as âncoras `(^, $)` são usadas para verificar se o padrão está no início ou no final da string de entrada. Mas se queremos que as âncoras funcionem em cada uma das linhas, usamos a flag `m`. Por exemplo, a expressão regular `/at(.)?$/gm` significa: o caractere minúsculo `a`, seguido do caractere minúsculo `t`, opcionalmente seguido por qualquer caractere, exceto nova linha. E por causa da flag `m`, agora o motor de expressões regulares encontra o padrão no final de cada uma das linhas da string. + +<pre> +"/.at(.)?$/" => The fat + cat sat + on the <a href="#learn-regex"><strong>mat.</strong></a> +</pre> + +[Teste a RegExp](https://regex101.com/r/hoGMkP/1) + +<pre> +"/.at(.)?$/gm" => The <a href="#learn-regex"><strong>fat</strong></a> + cat <a href="#learn-regex"><strong>sat</strong></a> + on the <a href="#learn-regex"><strong>mat.</strong></a> +</pre> + +[Teste a RegExp](https://regex101.com/r/E88WE2/1) + +## Contribution + +* Reporte bugs +* Abra pull request com melhorias +* Espalhe a palavra +* Me encontre diretamente em ziishaned@gmail.com ou [![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/ziishaned.svg?style=social&label=Follow%20%40ziishaned)](https://twitter.com/ziishaned) + +## Licença + +MIT © [Zeeshan Ahmed](mailto:ziishaned@gmail.com) diff --git a/README.md b/README.md index d1d958d..cf6bb79 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,7 @@ * [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) From f6a2cb0ccbfa78467c82d2a81a62fb388321eb07 Mon Sep 17 00:00:00 2001 From: Jacob Kim <astyfx@gmail.com> Date: Tue, 22 Aug 2017 13:21:49 +0900 Subject: [PATCH 28/36] Fix regex error in translation, ko (#79) --- README-ko.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README-ko.md b/README-ko.md index 9cace76..ecac09a 100644 --- a/README-ko.md +++ b/README-ko.md @@ -287,7 +287,7 @@ ## 4. 전후방탐색 -때때로 전후방탐색<sub>Lookaround</sub>이라고 알려진 후방탐색<sub>Lookbehind</sub>과 전방탐색<sub>Lookahead</sub>은 (패턴 매칭을 위해서 사용되지만 매칭된 리스트에는 포함되지 않는) ***넌-캡쳐링 그룹*** 의 특정 종류들이다. 전후방탐색은 하나의 패턴이 다른 특정 패턴 전이나 후에 나타나는 조건을 가지고 있을때 사용한다. 예를 들어, 우리가 입력 문자열 `$4.44 and $10.88`에 대해서 달러 부호 `$`이후에 나오는 모든 숫자를 매칭시키고 싶다고 하자. 이때 정규 표현식 `(?<=\$0[0-9\.]*`를 사용할 수 있다. 이 정규 표현식은 `$` 문자 뒤에 나오는 문자 `.`을 포함한 모든 숫자 문자를 의미한다. 다음은 정규 표현식에서 사용되는 전후방탐색들이다. +때때로 전후방탐색<sub>Lookaround</sub>이라고 알려진 후방탐색<sub>Lookbehind</sub>과 전방탐색<sub>Lookahead</sub>은 (패턴 매칭을 위해서 사용되지만 매칭된 리스트에는 포함되지 않는) ***넌-캡쳐링 그룹*** 의 특정 종류들이다. 전후방탐색은 하나의 패턴이 다른 특정 패턴 전이나 후에 나타나는 조건을 가지고 있을때 사용한다. 예를 들어, 우리가 입력 문자열 `$4.44 and $10.88`에 대해서 달러 부호 `$`이후에 나오는 모든 숫자를 매칭시키고 싶다고 하자. 이때 정규 표현식 `(?<=\$)[0-9\.]*`를 사용할 수 있다. 이 정규 표현식은 `$` 문자 뒤에 나오는 문자 `.`을 포함한 모든 숫자 문자를 의미한다. 다음은 정규 표현식에서 사용되는 전후방탐색들이다. |부호|설명| |:----:|----| From 30fd8c4e26b644587ad28436d933089f2027a56f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BD=BB=E9=94=AE=E5=BF=AB=E7=A0=81?= <xiaoranran1993@163.com> Date: Tue, 22 Aug 2017 21:06:04 +0800 Subject: [PATCH 29/36] fix a misspell (#80) --- README-cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README-cn.md b/README-cn.md index 92a6243..596c791 100644 --- a/README-cn.md +++ b/README-cn.md @@ -354,7 +354,7 @@ `?=...` 前置约束(存在), 表示第一部分表达式必须跟在 `?=...`定义的表达式之后. -返回结果只瞒住第一部分表达式. +返回结果只满足第一部分表达式. 定义一个前置约束(存在)要使用 `()`. 在括号内部使用一个问号和等号: `(?=...)`. 前置约束的内容写在括号中的等号后面. From c38baf18f496b2573a0b573e12a21fc6f51d9b62 Mon Sep 17 00:00:00 2001 From: Brian Strauch <bstrauch24@gmail.com> Date: Tue, 22 Aug 2017 22:23:53 -0500 Subject: [PATCH 30/36] Fixed grammar in lookaround section (#84) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cf6bb79..ce76da3 100644 --- a/README.md +++ b/README.md @@ -380,8 +380,8 @@ shorthand character sets are as follows: ## 4. Lookaround -Lookbehind and lookahead sometimes known as lookaround are specific type of -***non-capturing group*** (Use to match the pattern but not included in matching +Lookbehind and lookahead (also called lookaround) are specific types of +***non-capturing groups*** (Used to match the pattern but not included in matching list). Lookaheads are used when we have the condition that this pattern is preceded or followed by another certain pattern. For example, we want to get all numbers that are preceded by `$` character from the following input string From 17571a9d82d4c53cc315226aa361a5380bf9b264 Mon Sep 17 00:00:00 2001 From: Zeeshan Ahmed <ziishaned@gmail.com> Date: Thu, 24 Aug 2017 10:14:08 +0500 Subject: [PATCH 31/36] Fix #86 - Replace character set with character group --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index ce76da3..3dde94b 100644 --- a/README.md +++ b/README.md @@ -405,13 +405,13 @@ that is matched by the first part of the expression. To define a positive lookahead, parentheses are used. Within those parentheses, a question mark with equal sign is used like this: `(?=...)`. Lookahead expression is written after the equal sign inside parentheses. For example, the regular expression -`[T|t]he(?=\sfat)` means: optionally match lowercase letter `t` or uppercase +`(T|t)he(?=\sfat)` means: optionally match lowercase letter `t` or uppercase letter `T`, followed by letter `h`, followed by letter `e`. In parentheses we define positive lookahead which tells regular expression engine to match `The` or `the` which are followed by the word `fat`. <pre> -"[T|t]he(?=\sfat)" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. +"(T|t)he(?=\sfat)" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. </pre> [Test the regular expression](https://regex101.com/r/IDDARt/1) @@ -422,12 +422,12 @@ Negative lookahead is used when we need to get all matches from input string that are not followed by a pattern. Negative lookahead defined same as we define positive lookahead but the only difference is instead of equal `=` character we use negation `!` character i.e. `(?!...)`. Let's take a look at the following -regular expression `[T|t]he(?!\sfat)` which means: get all `The` or `the` words +regular expression `(T|t)he(?!\sfat)` which means: get all `The` or `the` words from input string that are not followed by the word `fat` precedes by a space character. <pre> -"[T|t]he(?!\sfat)" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat. +"(T|t)he(?!\sfat)" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat. </pre> [Test the regular expression](https://regex101.com/r/V32Npg/1) @@ -436,11 +436,11 @@ character. Positive lookbehind is used to get all the matches that are preceded by a specific pattern. Positive lookbehind is denoted by `(?<=...)`. For example, the -regular expression `(?<=[T|t]he\s)(fat|mat)` means: get all `fat` or `mat` words +regular expression `(?<=(T|t)he\s)(fat|mat)` means: get all `fat` or `mat` words from input string that are after the word `The` or `the`. <pre> -"(?<=[T|t]he\s)(fat|mat)" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the <a href="#learn-regex"><strong>mat</strong></a>. +"(?<=(T|t)he\s)(fat|mat)" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the <a href="#learn-regex"><strong>mat</strong></a>. </pre> [Test the regular expression](https://regex101.com/r/avH165/1) @@ -453,7 +453,7 @@ regular expression `(?<!(T|t)he\s)(cat)` means: get all `cat` words from input string that are not after the word `The` or `the`. <pre> -"(?<![T|t]he\s)(cat)" => The cat sat on <a href="#learn-regex"><strong>cat</strong></a>. +"(?<!(T|t)he\s)(cat)" => The cat sat on <a href="#learn-regex"><strong>cat</strong></a>. </pre> [Test the regular expression](https://regex101.com/r/8Efx5G/1) From fc7473cd78606f3b2647dce090771264f415d8a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=9CJDAT=20=C3=87=C4=B0=C3=87EK?= <mujdat.cicek@gmail.com> Date: Fri, 25 Aug 2017 05:51:31 +0300 Subject: [PATCH 32/36] Translate to Turkish (#82) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * meta karakterlere kadar çevrildi * typo fix * 2.4'e kadar çevrildi * 2.5 * typo fix * çeviri tamamlandı * linkler düzenlendi * turkish translation completed * some fixes --- README-cn.md | 1 + README-es.md | 1 + README-fr.md | 1 + README-ja.md | 1 + README-ko.md | 1 + README-tr.md | 478 ++++++++++++++++++++++++++++++++++++++++++++++ README.md | 1 + img/regexp-tr.png | Bin 0 -> 35338 bytes 8 files changed, 484 insertions(+) create mode 100644 README-tr.md create mode 100644 img/regexp-tr.png diff --git a/README-cn.md b/README-cn.md index 596c791..b6e5191 100644 --- a/README-cn.md +++ b/README-cn.md @@ -11,6 +11,7 @@ * [中文版](README-cn.md) * [日本語](README-ja.md) * [한국어](README-ko.md) +* [Turkish](README-tr.md) ## 什么是正则表达式? diff --git a/README-es.md b/README-es.md index 52e82a4..6fc16ba 100644 --- a/README-es.md +++ b/README-es.md @@ -11,6 +11,7 @@ * [中文版](README-cn.md) * [日本語](README-ja.md) * [한국어](README-ko.md) +* [Turkish](README-tr.md) ## What is Regular Expression? > 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 115ab92..b225a9d 100644 --- a/README-fr.md +++ b/README-fr.md @@ -11,6 +11,7 @@ * [中文版](README-cn.md) * [日本語](README-ja.md) * [한국어](README-ko.md) +* [Turkish](README-tr.md) ## Qu'est-ce qu'une expression régulière? diff --git a/README-ja.md b/README-ja.md index c77d970..ea0b074 100644 --- a/README-ja.md +++ b/README-ja.md @@ -11,6 +11,7 @@ * [中文版](README-cn.md) * [日本語](README-ja.md) * [한국어](README-ko.md) +* [Turkish](README-tr.md) ## 正規表現とは diff --git a/README-ko.md b/README-ko.md index ecac09a..c216f72 100644 --- a/README-ko.md +++ b/README-ko.md @@ -11,6 +11,7 @@ * [中文版](README-cn.md) * [日本語](README-ja.md) * [한국어](README-ko.md) +* [Turkish](README-tr.md) ## 정규표현식이란 무엇인가? diff --git a/README-tr.md b/README-tr.md new file mode 100644 index 0000000..837ec94 --- /dev/null +++ b/README-tr.md @@ -0,0 +1,478 @@ +<br/> +<p align="center"> +<img src="https://i.imgur.com/bYwl7Vf.png" alt="Learn Regex"> +</p><br/> + +## Çeviriler: + +* [English](README.md) +* [Español](README-es.md) +* [Français](README-fr.md) +* [中文版](README-cn.md) +* [日本語](README-ja.md) +* [한국어](README-ko.md) +* [Turkish](README-tr.md) + +## Düzenli İfade Nedir? + +> Düzenli ifade, bir metinden belirli bir deseni bulmak için kullanılan bir karakter veya sembol grubudur. + +Bir düzenli ifade soldan sağa söz konusu harf öbekleriyle eşleşen bir desendir. "Regular expression" söylemesi zor bir tabirdir, genellikle "regex" ya da "regexp" olarak kısaltılmış terimler olarak bulacaksınız. Düzenli ifade bir harf öbeğinde ki bir metin değiştirmek, form doğrulamak, bir desen eşleşmesine dayalı harf öbeğinden bir alt harf öbeği ayıklamak ve çok daha fazlası için kullanılır. + +Bir uygulama yazdığınızı hayal edin ve bir kullanıcı kullanıcı adını seçtiğinde kullanıcı adı için kurallar belirlemek istiyorsunuz. Kullanıcı adının harfler, sayılar, altçizgiler ve tireler içermesine izin vermek istiyoruz. Ayrıca, Kullanıcı adındaki karakter sayısını sınırlamak istiyoruz böylece çirkin görünmeyecek. Bir kullanıcı adını doğrulamak için aşağıdaki düzenli ifadeyi kullanıyoruz: + +<br/><br/> +<p align="center"> + <img src="./img/regexp-tr.png" alt="Regular expression"> +</p> + +Yukardaki düzenli ifade `john_doe`, `jo-hn_doe` ve `john12_as` gibi girişleri kabul edebilir. +`Jo` girişi uyuşmaz, çünkü harf öbeği büyük harf içeriyor ve aynı zamanda uzunluğu 3 karakterden az. + +## İçindekiler + +- [Temel Eşleştiriciler](#1-temel-eşleştiriciler) +- [Meta Karakterler](#2-meta-karakterler) + - [Nokta](#21-nokta) + - [Karakter takımı](#22-karakter-takımı) + - [Negatiflenmiş karakter seti](#221-negatiflenmiş-karakter-seti) + - [Tekrarlar](#23-tekrarlar) + - [Yıldız İşareti](#231-yıldız-İşareti) + - [Artı İşareti](#232-artı-İşareti) + - [Soru İşareti](#233-soru-İşareti) + - [Süslü Parantez](#24-süslü-parantez) + - [Karakter Grubu](#25-karakter-grubu) + - [Değişim](#26-değişim) + - [Özel Karakter Hariç Tutma](#27-Özel-karakter-hariç-tutma) + - [Sabitleyiciler](#28-sabitleyiciler) + - [Ters v işareti](#281-Şapka-İşareti) + - [Dolar işareti](#282-dolar-İşareti) +- [Kısaltma Karakter Takımları](#3-kısaltma-karakter-takımları) +- [Bakınmak](#4-bakınmak) + - [Olumlu Bakınma](#41-positive-lookahead) + - [Olumsuz Bakınma](#42-negative-lookahead) + - [Positive Lookbehind](#43-positive-lookbehind) + - [Negative Lookbehind](#44-negative-lookbehind) +- [İşaretler](#5-İşaretler) + - [Büyük/Küçük harf duyarlılığı](#51-büyükküçük-harf-duyarlılığı) + - [Bütünsel Arama](#52-genel-arama) + - [Çok satırlı](#53-Çok-satırlı) + +## 1. Temel Eşleştiriciler + +Bir düzenli ifade bir metin içinde arama yapabilmek için kullandığımız bir karakter desenidir. +Örneğin, `the` düzenli ifadesi şu anlama gelir: `t` harfi ardından `h`, ardından `e` harfi gelir. + +<pre> +"the" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/dmRygT/1) + +`123` düzenli ifadesi `123` harf öbeğiyle eşleşir. Düzenli ifade birbiri ardına, girilen harf öbeğindeki her karakter düzenli ifadenin içindeki her karakterle karşılaştırılarak eşleştirilir. Düzenli ifadeler normal olarak büyük/küçük harfe duyarlıdırlar, yani `The` düzenli ifadesi `the` harf öbeğiyle eşleşmez. + +<pre> +"The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/1paXsy/1) + +## 2. Meta Karakterler + +Meta karakterler düzenli ifadelerin yapı taşlarıdırlar. Meta karakterler kendileri için değil bunun yerine bazı özel yollarla yorumlanırlar. Bazı meta karakterler özel anlamları vardır ve bunlar köşeli parantez içinde yazılırlar. + +Meta karakterler aşağıdaki gibidir: + +|Meta karakter|Açıklama| +|:----:|----| +|.|Satır sonuc hariç herhangi bir karakterle eşleşir.| +|[ ]|Köşeli parantezler arasında bulunan herhangi bir karakterle eşleşir.| +|[^ ]|Köşeli parantez içerisinde yer alan `^` işaretinden sonra girilen karakterler haricindeki karakterlerle eşleşir.| +|*|Kendisinden önce yazılan karakterin sıfır veya daha fazla tekrarı ile eşleşir.| +|+|Kendisinden önce yazılan karakterin bir veya daha fazla tekrarı ile eşleşir.| +|?|Kendisinden önce yazılan karakterin varlık durumunu opsiyonel kılar.| +|{n,m}|Kendisinden önce yazılan karakterin en az `n` en fazla `m` değeri kadar olmasını ifade eder.| +|(xyz)|Verilen sırayla `xyz` karakterleriyle eşleşir.| +|||`|` karakterinden önce veya sonra verilen ifadelerin herhangi biriyle eşleşir. Or anlamı verir.| +|\|Sonraki karakteri kaçırır. Bu, ayrılmış karakterleri eşleştirmenizi sağlar <code>[ ] ( ) { } . * + ? ^ $ \ |</code>| +|^|Girilen verinin başlangıcını ifade eder.| +|$|Girilen veririnin sonunu ifade eder.| + +## 2.1 Nokta + +Nokta `.` meta karakterin en basit örneğidir. `.` meta karakteri satır başlangıcı hariç herhangi bir karakterle eşleşir. +Örneğin, `.ar` düzenli ifadesinin anlamı: herhangi bir karakterin ardından `a` harfi ve `r` harfi gelir. + +<pre> +".ar" => The <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/xc9GkU/1) + +## 2.2 Karakter Takımı + +Karakter takımları aryıca Karakter sınıfı olarak bilinir. Karakter takımlarını belirtmek için köşeli ayraçlar kullanılır. +Karakterin aralığını belirtmek için bir karakter takımında tire kullanın. Köşeli parantezlerdeki karakter aralığının sıralaması önemli değildir. + +Örneğin, `[Tt]he` düzenli ifadesinin anlamı: bir büyük `T` veya küçük `t` harflerinin ardından sırasıyla `h` ve `e` harfi gelir. + +<pre> +"[Tt]he" => <a href="#learn-regex"><strong>The</strong></a> car parked in <a href="#learn-regex"><strong>the</strong></a> garage. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/2ITLQ4/1) + +Bununla birlikte, bir karakter takımı içerisindeki bir periyot bir tam periyot demektir. + +`ar[.]` düzenli ifadesinin anlamı: Küçük `a` karakteri ardından `r` harfi gelir, ardından bir `.` karakteri gelir. + +<pre> +"ar[.]" => A garage is a good place to park a c<a href="#learn-regex"><strong>ar.</strong></a> +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/wL3xtE/1) + +### 2.2.1 Negatiflenmiş karakter seti + +Genellikle, şapka `^` sembolü harf öbeğinin başlangıcını temsil eder, ama köşeli parantez içinde kullanıldığında verilen karakter takımını hariç tutar. + +Örneğin, `[^c]ar` ifadesinin anlamı: `c` harfinden hariç herhangi bir harfin ardından `a`, ardından `r` gelir. + +<pre> +"[^c]ar" => The car <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/nNNlq3/1) + +## 2.3 Tekrarlar + +`+`, `*` ya da `?` meta karakterlerinden sonra bir alt desenin kaç defa tekrar edebileceğini belirtmek için kullanılır. Bu meta karakterler farklı durumlarda farklı davranırlar. + +### 2.3.1 Yıldız İşareti + +`*` sembolü, kendinden önce girilen eşlemenin sıfır veya daha fazla tekrarıyla eşleşir. Ama bir karakter seti ya da sınıf sonrasına girildiğinde, tüm karakter setinin tekrarlarını bulur. + +`a*` düzenli ifadesinin anlamı: `a` karakterinin sıfır veya daha fazla tekrarı. +`[a-z]*` düzenli ifadesinin anlamı: bir satırdaki herhangi bir sayıdaki küçük harfler. + +<pre> +"[a-z]*" => T<a href="#learn-regex"><strong>he</strong></a> <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>parked</strong></a> <a href="#learn-regex"><strong>in</strong></a> <a href="#learn-regex"><strong>the</strong></a> <a href="#learn-regex"><strong>garage</strong></a> #21. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/7m8me5/1) + +`*` sembolü `.` meta karakteri ile `.*` karakterinin herhangi harf öbeğine eşleştirmek için kullanılabilir. `*` sembolü boşluk karakteriyle `\s` bir harf öbeğinde boşluk karakterlerini eşleştirmek için kullanılabilir. + +Örneğin, `\s*cat\s*` düzenli ifadesinin anlamı: sıfır veya daha fazla boşluk ardından küçük `c` karakteri gelir, ardından küçük `a` karakteri gelir, ardından küçük `t` karakteri gelir, ardından sıfır veya daha fazla boşluk gelir. + +<pre> +"\s*cat\s*" => The fat<a href="#learn-regex"><strong> cat </strong></a>sat on the <a href="#learn-regex">con<strong>cat</strong>enation</a>. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/gGrwuz/1) + +### 2.3.2 Artı İşareti + +`+` sembolü, kendinden önce girilen eşlemenin bir veya daha fazla tekrarıyla eşleşir. + +Örneğin, `c.+t` ifadesinin anlamı: küçük `c` harfi, ardından en az bir karakter gelir, ardından küçük `t` karakteri gelir. +Örnekte açıklamak gereken önemli nokta: `t` harfi cümledeki son `t` harfi olacaktır. `c` ve `t` harfi arasında en az bir karakter vardır. + +<pre> +"c.+t" => The fat <a href="#learn-regex"><strong>cat sat on the mat</strong></a>. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/Dzf9Aa/1) + +### 2.3.3 Soru İşareti + +Düzenli ifadelerde `?` meta karakterinden önce girilen karakteri opsiyonel olarak tanımlar. Bu sembol önce gelen karakterin sıfır veya bir örbeğiyle eşleşir. + +Örneğin, `[T]?he` ifadesinin anlamı: opsiyonel büyük `T` harfi, ardından küçük `h` karakteri gelir, ardından küçük `e` karakteri gelir. + +<pre> +"[T]he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/cIg9zm/1) + +<pre> +"[T]?he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in t<a href="#learn-regex"><strong>he</strong></a> garage. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/kPpO2x/1) + +## 2.4 Süslü Parantez + +Düzenli ifadelerde miktar belirliyiciler olarakda bilinen süslü parantezler, bir karakterin veya karakter grubunun kaç defa tekrar edebileceğini belirtmek için kullanılırlar. + +Örneğin, `[0-9]{2,3}` ifadesinin anlamı: 0 ile 0 aralığındaki karakterlerden, en az 2 en fazla 3 defa ile eşleş. + +<pre> +"[0-9]{2,3}" => The number was 9.<a href="#learn-regex"><strong>999</strong></a>7 but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/juM86s/1) + +İkinci numarayı boş bırakabiliriz. + +Örneğin, `[0-9]{2,}` ifadesinin anlamı: En az 2 veya daha fazla defa eşleş. +Düzenli ifadeden virgülü kaldırırsak `[0-9]{3}`: doğrudan 3 defa eşleşir. + +<pre> +"[0-9]{2,}" => The number was 9.<a href="#learn-regex"><strong>9997</strong></a> but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/Gdy4w5/1) + +<pre> +"[0-9]{3}" => The number was 9.<a href="#learn-regex"><strong>999</strong></a>7 but we rounded it off to 10.0. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/Sivu30/1) + +## 2.5 Karakter Grubu + +Karakter grubu parantezler içine yazılmış alt desenler grubudur. Daha önce tasarım deseninde değindiğimiz gibi, bir karakterden önce bir miktar belirleyici koyarsak önceki karakteri tekrar eder. Fakat miktar belirleyiciyi bir karakter grubundan sonra koyarsak tüm karakter grubunu tekrarlar. + +Örneğin: `(ab)*` düzenli ifadesi "ab" karakterinin sıfır veya daha fazla tekrarıyla eşleşir. + +Ayrıca karakter grubu içinde `|` meta karakterini kullanabiliriz. + +Örneğin, `(c|g|p)ar` düzenli ifadesinin anlamı: küçük `c`, `g` veya `p` karakteri, ardından `a` karakteri, ardından `r` karakteri gelir. + +<pre> +"(c|g|p)ar" => The <a href="#learn-regex"><strong>car</strong></a> is <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/tUxrBG/1) + +## 2.6 Değişim + +Düzenli ifadede dik çizgi alternasyon(değişim, dönüşüm) tanımlamak için kullanılır. Alternasyon birden fazla ifade arasındaki bir koşul gibidir. Şu an, karakter grubu ve alternasyonun aynı şekilde çalıştığını düşünüyor olabilirsiniz. Ama, Karakter grubu ve alternasyon arasındaki büyük fark karakter grubu karakter düzeyinde çalışır ama alternasyon ifade düzeyinde çalışır. + +Örneğin, `(T|t)he|car` düzenli ifadesinin anlamı: Büyük `T` ya da küçük `t` karakteri, ardından küçük `h` karakteri, ardından küçük `e` ya da `c` karakteri, ardından küçük `a`, ardından küçük `r` karakteri gelir. + +<pre> +"(T|t)he|car" => <a href="#learn-regex"><strong>The</strong></a> <a href="#learn-regex"><strong>car</strong></a> is parked in <a href="#learn-regex"><strong>the</strong></a> garage. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/fBXyX0/1) + +## 2.7 Özel Karakter Hariç Tutma + +`\` işareti sonraki karakteri hariç tutmak için kullanılır. Bu bir semboülü ayrılmış karakterlerde `{ } [ ] / \ + * . $ ^ | ?` dahil olmak üzere eşleşen bir karakter olarak belirtmemizi sağlar. Bir özel karakteri eşleşen bir karakter olarak kullanmak için önüne `\` işareti getirin. + +Örneğin, `.` düzenli ifadesi yeni satır hariç herhangi bir karakteri eşleştirmek için kullanılır. +Bir harf öbeği içinde nokta `.` karakterini yakalamak için `.` ayrılmış karakterini hariç tutmamız gerekir. Bunun için nokta önüne `\` işaretini koymamız gereklidir. + +`(f|c|m)at\.?` düzenli ifadesinin anlamı: küçük `f`, `c`ya da `m` harfi, ardından küçük `a` harfi, ardından küçük `t` harfi, ardından opsiyonel `.` karakteri gelir. + +<pre> +"(f|c|m)at\.?" => The <a href="#learn-regex"><strong>fat</strong></a> <a href="#learn-regex"><strong>cat</strong></a> sat on the <a href="#learn-regex"><strong>mat.</strong></a> +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/DOc5Nu/1) + +## 2.8 Sabitleyiciler + +Düzenli ifadelerde, eşleşen sembolün girilen harf öbeğinin başlangıç sembolü veya bitiş sembolü olup olmadığını kontrol etmek için sabitleyicileri kullanırız. +Sabitleyiciler iki çeşittir: İlk çeşit eşleşen karakterin girişin ilk karakteri olup olmadığını kontrol eden şapka `^` karakteri, ve ikinci çeşit eşleşen karakterin girişin son karakteri olup olmadığını kontrol eden dolar `$` karakteridir. + +### 2.8.1 Şapka İşareti + +Şapka `^` işareti eşleşen karakterin giriş harf öbeğinin ilk karakteri olup olmadığını kontrol etmek için kullanılır. +Eğer `^a` düzenli ifadesini `abc` harf öbeğine uygularsak `a` ile eşleşir. Ama `^b` ifadesini uygularsak bir eşleşme bulamayız. Bunun nedeni `abc` harf öbeğinde `b` karakterinin başlangıç karakteri olmamasıdır. + +Bir başka örnek üzerinden ilerlersek, + +`^(T|t)he` düzenli ifadesinin anlamı: büyük `T` ya da `t` karakteri giriş harf öbeğinin ilk karakteri olmak üzere, ardından küçük `h`, ardından küçük `e` karakteri gelir. + +<pre> +"(T|t)he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in <a href="#learn-regex"><strong>the</strong></a> garage. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/5ljjgB/1) + +<pre> +"^(T|t)he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/jXrKne/1) + +### 2.8.2 Dolar İşareti + +Dolar `$` işareti eşleşen karakterin giriş harf öbeğinin son karakteri olup olmadığını kontrol etmek için kullanılır. + +Örneğin, `(at\.)$` ifadesinin anlamı: küçük bir `a` karakteri, ardından küçük bir `t` karakteri, ardıdan nokta `.` karakteri gelir ve bu eşleşme harf öbeğinin sonunda olmalıdır. + +<pre> +"(at\.)" => The fat c<a href="#learn-regex"><strong>at.</strong></a> s<a href="#learn-regex"><strong>at.</strong></a> on the m<a href="#learn-regex"><strong>at.</strong></a> +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/y4Au4D/1) + +<pre> +"(at\.)$" => The fat cat. sat. on the m<a href="#learn-regex"><strong>at.</strong></a> +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/t0AkOd/1) + +## 3. Kısaltma Karakter Takımları + +Regex, yaygın olarak kullanılan düzenli ifadeler için uygun kısaltmalar sunan sık kullanılan karakter setleri için kısaltmalar sağlar. + +Kullanılan karakter setleri kısaltmaları aşağıdaki gibidir: + +|Kısaltma|Açıklama| +|:----:|----| +|.|Satır başı hariç herhangi bir karakter| +|\w|Alfanumerik karakterlerle eşleşir: `[a-zA-Z0-9_]`| +|\W|Alfanumerik olmayan karakterlerle eşleşir: `[^\w]`| +|\d|Rakamlarla eşlelir: `[0-9]`| +|\D|Rakam olmayan karakterlerle eşleşir: `[^\d]`| +|\s|Boşluk karakteri ile eşleşir: `[\t\n\f\r\p{Z}]`| +|\S|Boşluk karakteri olmayan karakterlerle eşleşir: `[^\s]`| + +## 4. Bakınmak + +Bakınma sembolleri, bir ifade öncesinde veya sonrasında başka bir ifademiz olduğunda kullanılırlar. + +Örneğin, `$4.44 ve $10.88` girişlerinden `$` karakteri önündeki tüm sayıları almak istiyoruz, bu durumda `(?<=\$)[0-9\.]*` ifadesini kullanırız. + +`(?<=\$)[0-9\.]*` ifadesinin anlamı: `.` karakterini içeren ve `$` karakteriyle devam eden tüm sayıları al. + +Düzenli ifadelerde kullanılan bakınma sembolleri aşağıdadır: + +|Sembol|Açıklama| +|:----:|----| +|?=|Positive Lookahead (Verdiğimiz ifade sonrası arar ve `eşleşme varsa` sonuç döndürür.)| +|?!|Negative Lookahead (Verdiğimiz ifade sonrası arar ve `eşleşme yoksa` sonuç döndürür.)| +|?<=|Positive Lookbehind (Verdiğimiz ifade öncesini arar ve `eşleşme varsa` sonuç döndürür.)| +|?<-!-|Negative Lookbehind Verdiğimiz ifade öncesini arar ve `eşleşme yoksa` sonuç döndürür.| + +### 4.1 Positive Lookahead + +Positive Lookahead, ifadenin ilk bölümü bakınma ifadesiyle devam etmesi gerektiğini savunur. Bulunan eşleşme yalnızca ifadenin ilk bölümüyle eşleşen metin içerir. Olumlu bir bakınma tanımlamak için, içinde eşittir işareti yer alan parantezler `(?=...)` şeklinde kullanılır. Bakınma ifadesi parantezler içinde eşittir işaretinden sonra yazılır. + +Örneğin, `[T|t]he(?=\sfat)` ifadesinin anlamı: opsiyonel küçük bir `t` ya da büyük `T` harfi, ardından `h` harfi gelir, ardından `e` harfi gelir. Parantez içinde ise bu dizilimin bir boşluk karakterinden sonra `fat` öbeğiyle devam edeceğini tanımlıyoruz. + +<pre> +"[T|t]he(?=\sfat)" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/IDDARt/1) + +### 4.2 Negative Lookahead + +Negative Lookahead sembolü positive lookahead tersine, verdiğimiz desenle devam etmemesi durumunda eşleşir. Bu sembol positive lookahead gibi tanımlanır ama `=` işareti yerine `!` kullanılır. + +`[T|t]he(?!\sfat)` ifadesinin anlamı: opsiyonel küçük bir `t` ya da büyük `T` harfi, ardından `h` harfi gelir, ardından `e` harfi gelir, ardından öncesinde boşluk olan bir `fat` öbeği olmamalıdır. + + +<pre> +"[T|t]he(?!\sfat)" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/V32Npg/1) + +### 4.3 Positive Lookbehind + +Positive Lookbehind, belirli bir desenden önceki eşleşmeleri almak için kullanılır. `(?<=...)` ile gösterilir. + +Örneğin, `(?<=[T|t]he\s)(fat|mat)` ifadesinin anlamı: Öncesinde `The` veya `the` öbekleri olan tüm `fat` veya `mat` öbeklerini getir. + +<pre> +"(?<=[T|t]he\s)(fat|mat)" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the <a href="#learn-regex"><strong>mat</strong></a>. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/avH165/1) + +### 4.4 Negative Lookbehind + +Negative Lookbehind, belirli bir desenden önce olmayan eşleşmeleri almak için kullanılır. `(?<=!..)` ile gösterilir. + +Örneğin, `(?<!(T|t)he\s)(cat)` ifadesinin anlamı: Öncesinde `The` veya `the` öbekleri yer almayan tüm `cat` öbeklerini getir. + +<pre> +"(?<![T|t]he\s)(cat)" => The cat sat on <a href="#learn-regex"><strong>cat</strong></a>. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/8Efx5G/1) + +## 5. İşaretler + +İşaretler ayrıca düzenleyiciler olarak bilinirler, çünkü onlar bir düzenli ifadenin çıktısını düzenlerler. Bu işaretler herhangi bir sırada veya kombinasyonda kullanılabilirler, ve bunlar Düzenli İfadelerin ayrılmaz bir parçasıdırlar. + +|İşaret|Açıklama| +|:----:|----| +|i|Büyük küçük harf duyarlılık: Eşleştirmeleri küçük/büyük harfe karşı duyarsız yapar.| +|g|Genel Arama: Girilen harf öbeği boyunca bir desen arar.| +|m|Çok satırlı: Sabitleyici meta karakteri her satırda çalışır.| + +### 5.1 Büyük/Küçük harf duyarlılığı + +`ì` işaretleyicisi büyük/küçük harfe duyarsız eşleştirme yapmak için kullanılır. + +Örneğin, `/The/gi` ifadesi: büyük `T` harfi, ardından küçük `h` harfi, ardından küçük `e` harfi gelir. ifadenin sonunda yer alan `i` işareti büyük-küçük harfe karşı duyarsız olması gerektiğini belirtir. Ayrıca `g` işaretinide kullandığımızı görebilirsiniz, tüm text içinde bu aramayı yapmak istediğimiz için `g` işaretini ayrıca belirtiyoruz. + +<pre> +"The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/dpQyf9/1) + +<pre> +"/The/gi" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/ahfiuh/1) + +### 5.2 Genel Arama + +`g` işareti bir giriş içinde eşleşen tüm varsayonları bulmak için kullanılır. `g` işareti kullanılmazsa ilk eşleşme bulunduktan sonra arama sona erer. + +<pre> +"/.(at)/" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the mat. +</pre> + +[Test the regular expression](https://regex101.com/r/jnk6gM/1) + +<pre> +"/.(at)/g" => The <a href="#learn-regex"><strong>fat</strong></a> <a href="#learn-regex"><strong>cat</strong></a> <a href="#learn-regex"><strong>sat</strong></a> on the <a href="#learn-regex"><strong>mat</strong></a>. +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/dO1nef/1) + +### 5.3 Çok Satırlı + +`m` işareti çok satırlı bir eşleşme sağlamak için kullanılır. Daha önce sabitleyicilerde gördüğümüz gibi `(^, $)` sembolleri aradığımız desenin harf öbeğinin başında veya sonunda olup olmadığını kontrol etmemiz için kullanılır. Bu sabitleyicilerin tüm satırlarda çalışması için `m` işaretini kullanırız. + +Örneğin, `/at(.)?$/gm` ifadesinin anlamı: küçük `a` harfi, ardından küçük `t` harfi gelir, ardından opsiyonel olarak yeni satır hariç herhangi birşey gelebilir. `m` işaretini kullandığımız için bir girişin her satırının sonunda eşleştirir. + +<pre> +"/.at(.)?$/" => The fat + cat sat + on the <a href="#learn-regex"><strong>mat.</strong></a> +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/hoGMkP/1) + +<pre> +"/.at(.)?$/gm" => The <a href="#learn-regex"><strong>fat</strong></a> + cat <a href="#learn-regex"><strong>sat</strong></a> + on the <a href="#learn-regex"><strong>mat.</strong></a> +</pre> + +[Düzenli ifadeyi test edin](https://regex101.com/r/E88WE2/1) + +## Contribution + +* Report issues +* Open pull request with improvements +* Spread the word +* Reach out to me directly at ziishaned@gmail.com or [![Twitter URL](https://img.shields.io/twitter/url/https/twitter.com/ziishaned.svg?style=social&label=Follow%20%40ziishaned)](https://twitter.com/ziishaned) + +## License + +MIT © [Zeeshan Ahmed](mailto:ziishaned@gmail.com) diff --git a/README.md b/README.md index 3dde94b..5650998 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ * [中文版](README-cn.md) * [日本語](README-ja.md) * [한국어](README-ko.md) +* [Turkish](README-tr.md) ## What is Regular Expression? diff --git a/img/regexp-tr.png b/img/regexp-tr.png new file mode 100644 index 0000000000000000000000000000000000000000..9285dfcff22e583b793b9f2436e65e300a174d1e GIT binary patch literal 35338 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 W&ld#;8S`NPe~NNyvX#<iA^#6lH5G~g literal 0 HcmV?d00001 From 2a787a27e94fde260915f309f2f5442bc1c0f1ae Mon Sep 17 00:00:00 2001 From: CoolGuy <admin@coolguy.pw> Date: Fri, 25 Aug 2017 10:52:28 +0800 Subject: [PATCH 33/36] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=94=99=E8=AF=AF=20(#?= =?UTF-8?q?87)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根据https://github.com/zeeshanu/learn-regex/issues/86,英文文档部分已经更新了,所以更新一下中文文档部分 --- README-cn.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README-cn.md b/README-cn.md index b6e5191..31c3d86 100644 --- a/README-cn.md +++ b/README-cn.md @@ -359,10 +359,10 @@ 定义一个前置约束(存在)要使用 `()`. 在括号内部使用一个问号和等号: `(?=...)`. 前置约束的内容写在括号中的等号后面. -例如, 表达式 `[T|t]he(?=\sfat)` 匹配 `The` 和 `the`, 在括号中我们又定义了前置约束(存在) `(?=\sfat)` ,即 `The` 和 `the` 后面紧跟着 `(空格)fat`. +例如, 表达式 `(T|t)he(?=\sfat)` 匹配 `The` 和 `the`, 在括号中我们又定义了前置约束(存在) `(?=\sfat)` ,即 `The` 和 `the` 后面紧跟着 `(空格)fat`. <pre> -"[T|t]he(?=\sfat)" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. +"(T|t)he(?=\sfat)" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. </pre> [在线练习](https://regex101.com/r/IDDARt/1) @@ -372,10 +372,10 @@ 前置约束-排除 `?!` 用于筛选所有匹配结果, 筛选条件为 其后不跟随着定义的格式 `前置约束-排除` 定义和 `前置约束(存在)` 一样, 区别就是 `=` 替换成 `!` 也就是 `(?!...)`. -表达式 `[T|t]he(?!\sfat)` 匹配 `The` 和 `the`, 且其后不跟着 `(空格)fat`. +表达式 `(T|t)he(?!\sfat)` 匹配 `The` 和 `the`, 且其后不跟着 `(空格)fat`. <pre> -"[T|t]he(?!\sfat)" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat. +"(T|t)he(?!\sfat)" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat. </pre> [在线练习](https://regex101.com/r/V32Npg/1) @@ -383,10 +383,10 @@ ### 4.3 `?<= ...` 后置约束-存在 后置约束-存在 记作`(?<=...)` 用于筛选所有匹配结果, 筛选条件为 其前跟随着定义的格式. -例如, 表达式 `(?<=[T|t]he\s)(fat|mat)` 匹配 `fat` 和 `mat`, 且其前跟着 `The` 或 `the`. +例如, 表达式 `(?<=(T|t)he\s)(fat|mat)` 匹配 `fat` 和 `mat`, 且其前跟着 `The` 或 `the`. <pre> -"(?<=[T|t]he\s)(fat|mat)" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the <a href="#learn-regex"><strong>mat</strong></a>. +"(?<=(T|t)he\s)(fat|mat)" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the <a href="#learn-regex"><strong>mat</strong></a>. </pre> [在线练习](https://regex101.com/r/avH165/1) @@ -397,7 +397,7 @@ 例如, 表达式 `(?<!(T|t)he\s)(cat)` 匹配 `cat`, 且其前不跟着 `The` 或 `the`. <pre> -"(?<![T|t]he\s)(cat)" => The cat sat on <a href="#learn-regex"><strong>cat</strong></a>. +"(?<!(T|t)he\s)(cat)" => The cat sat on <a href="#learn-regex"><strong>cat</strong></a>. </pre> [在线练习](https://regex101.com/r/8Efx5G/1) From a3a7b3ac3c16d3de9665476130406697c48aee33 Mon Sep 17 00:00:00 2001 From: Mohamed Oun <mohamed3on@gmail.com> Date: Sat, 26 Aug 2017 03:46:11 +0300 Subject: [PATCH 34/36] Fix a grammar typo (#88) Also added a small addition to clarify regex's default behavior without the g flag. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5650998..2fa1b74 100644 --- a/README.md +++ b/README.md @@ -498,7 +498,7 @@ The `g` modifier is used to perform a global match (find all matches rather than stopping after the first match). For example, the regular expression`/.(at)/g` means: any character except new line, followed by lowercase character `a`, followed by lowercase character `t`. Because we provided `g` flag at the end of -the regular expression now it will find every matches from whole input string. +the regular expression now it will find all matches in the input string, not just the first one (which is the default behavior). <pre> "/.(at)/" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the mat. From aea085349c566b380994429337cb5a31343c4eb7 Mon Sep 17 00:00:00 2001 From: ahmedaboukora <31317398+ahmedaboukora@users.noreply.github.com> Date: Sat, 26 Aug 2017 15:04:42 +0200 Subject: [PATCH 35/36] Update README-fr.md (#89) * Update README-fr.md hi, i'm ahmed, an french student, who learned regex. I wanted correct some mistakes like the lack of plurial in some expressions, and bad linking into 2 words. I corrected also the expression of string because in France for someone who don't know well computer science , the "string" means a clothes that people wear. I checked the file and everything is okay. I will check again tomorrow. I hope help you again. Ahmed * Update README-fr.md added (string) after "chaines de caracteres" --- README-fr.md | 84 +++++++++++++++++++++++++--------------------------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/README-fr.md b/README-fr.md index b225a9d..ea53f4e 100644 --- a/README-fr.md +++ b/README-fr.md @@ -17,9 +17,9 @@ > Une expression régulière est un groupement de caractères ou symboles utilisés pour trouver un schéma spécifique dans un texte. -Une expression régulière est un schéma qui est comparée à une chaîne de caractères de gauche à droite. Le mot "Expression régulière" +Une expression régulière est un schéma qui est comparé à une chaîne de caractères (string) de gauche à droite. Le mot "Expression régulière" est un terme entier, souvent abrégé par "regex" ou "regexp". Une expression régulière est utilisée pour remplacer un texte à l'intérieur -d'une *string* (une chaîne de caractères), valider un formulaire, extraire une portion de string basée sur un schéma, et bien plus encore. +d'une chaîne de caractères (string), valider un formulaire, extraire une portion de chaine de caractères (string) basée sur un schéma, et bien plus encore. Imaginons que nous écrivons une application et que nous voulons définir des règles pour le choix d'un pseudonyme. Nous voulons autoriser le pseudonyme à contenir des lettres, des nombres, des underscores et des traits d'union. Nous voulons aussi limiter le nombre @@ -29,8 +29,7 @@ de caractères dans le pseudonyme pour qu'il n'ait pas l'air moche. Nous utiliso <img src="./img/regexp-fr.png" alt="Expressions régulières"> </p> -L'expression régulière ci-dessus peut accepter les strings `john_doe`, `jo-hn_doe` et `john12_as`. Ça ne fonctionne pas avec `Jo` car -cette string contient une lettre majuscule et elle est trop courte. +L'expression régulière ci-dessus peut accepter les chaines de caractères (string) `john_doe`, `jo-hn_doe` et `john12_as`. Ça ne fonctionne pas avec `Jo` car cette chaine de caractères (string) contient une lettre majuscule et elle est trop courte. ## Table des matières @@ -63,7 +62,7 @@ cette string contient une lettre majuscule et elle est trop courte. ## 1. Introduction -Une expression régulière est un schéma de caractères utilisés pour effectuer une recherche dans un text. +Une expression régulière est un schéma de caractères utilisés pour effectuer une recherche dans un texte. Par exemple, l'expression régulière `the` signifie : la lettre `t`, suivie de la lettre `h`, suivie de la lettre `e`. <pre> @@ -82,23 +81,23 @@ L'expression régulière `123` coïncide à la chaîne `123`. Chaque caractère ## 2. Meta-caractères -Les meta-caractères sont les bloques de construction des expressions régulières. Les meta-caractères sont interprétés de manière particulière. Certains meta-caractères ont des significations spéciales et sont écrits entre crochets. +Les meta-caractères sont les blocs de construction des expressions régulières. Les meta-caractères sont interprétés de manière particulière. Certains meta-caractères ont des significations spéciales et sont écrits entre crochets. Significations des meta-caractères: |Meta-caractère|Description| |:----:|----| |.|Un point coïncide avec n'importe quel caractère unique à part le retour à la ligne.| -|[ ]|Classe de caractères. Coïncide avec n'importe quels caractères entre crochets.| -|[^ ]|Négation de classe de caractère. Coïncide avec n'importe quels caractères qui n'est pas entre les crochets.| +|[ ]|Classe de caractères. Coïncide avec n'importe quel caractère entre crochets.| +|[^ ]|Négation de classe de caractère. Coïncide avec n'importe quel caractère qui n'est pas entre les crochets.| |*|Coïncide avec 0 ou plus répétitions du caractère précédent.| |+|Coïncide avec 1 ou plus répétitions du caractère précédent.| |?|Rend le caractère précédent optionnel.| |{n,m}|Accolades. Coïncide avec au moins "n" mais pas plus que "m" répétition(s) du caractère précédent.| |(xyz)|Groupe de caractères. Coïncide avec les caractères "xyz" dans l'ordre exact.| -|||Alternation (ou). Coïncide soit avec le caractère avant ou après le symbol.| +|||Alternation (ou). Coïncide soit avec le caractère avant ou après le symbole.| |\|Échappe le prochain caractère. Cela permet de faire coïncider des caractères réservés tels que <code>[ ] ( ) { } . * + ? ^ $ \ |</code>| -|^|Coïncide avec le début de la chaîne de caractères.| -|$|Coïncide avec la fin de la chaîne de caractères.| +|^|Coïncide avec le début de la chaîne de caractères (string).| +|$|Coïncide avec la fin de la chaîne de caractères (string).| ## 2.1 Full stop @@ -112,7 +111,7 @@ Le full stop `.` est l'exemple le plus simple d'un meta-caratère. Le `.` coïnc ## 2.2 Inclusions de caractères -Les inclusions de caractères sont également appelées classes de caractères. Les crochets sont utilisés pour spécifier les inclusions de caractères. Un trait d'union utilisé dans une inclusion de caractères permet de définir une gamme de caractères. L'ordre utilisé dans la gamme de caractère n'a pas d'importance. Par exemple, l'expression régulière `[Tt]he` signifie : un `T` majuscule ou `t` minuscule, suivi par la lettre `h`, suivie par la lettre `e`. +Les inclusions de caractères sont également appelées classes de caractères. Les crochets sont utilisés pour spécifier les inclusions de caractères. Un trait d'union utilisé dans une inclusion de caractères permet de définir une gamme de caractères. L'ordre utilisé dans la gamme de caractère n'a pas d'importance. Par exemple, l'expression régulière `[Tt]he` signifie : un `T` majuscule ou `t` minuscule, suivie par la lettre `h`, suivie par la lettre `e`. <pre> "[Tt]he" => <a href="#learn-regex"><strong>The</strong></a> car parked in <a href="#learn-regex"><strong>the</strong></a> garage. @@ -130,7 +129,7 @@ L'utilisation du point dans une inclusion de caractère signifie toutefois un `. ### 2.2.1 Exclusion de caractères -En règle générale, le caractère circonflexe représente le début d'une chaîne de caractères. Néanmoins, lorsqu'il est utilisé après le crochet ouvrant, il permet d'exclure la gamme de caractère(s). Par exemple, l'expression régulière `[^c]ar` signifie : n'importe quel caractère sauf `c`, suivi par la lettre `a`, suivie par la lettre `r`. +En règle générale, le caractère circonflexe représente le début d'une chaîne de caractères (string). Néanmoins, lorsqu'il est utilisé après le crochet ouvrant, il permet d'exclure la gamme de caractères. Par exemple, l'expression régulière `[^c]ar` signifie : n'importe quel caractère sauf `c`, suivi par la lettre `a`, suivie par la lettre `r`. <pre> "[^c]ar" => The car <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age. @@ -140,14 +139,13 @@ En règle générale, le caractère circonflexe représente le début d'une cha ## 2.3 Répétitions -Les meta-caractères suivants `+`, `*` ou `?` sont utilisés pour spécifier combien de fois un sous-schéma peut apparaître. Ces meta-caractères agissent -différemment selon la situation dans laquelle ils sont utilisés. +Les meta-caractères suivants `+`, `*` ou `?` sont utilisés pour spécifier combien de fois un sous-schéma peut apparaître. Ces meta-caractères agissent différemment selon la situation dans laquelle ils sont utilisés. ### 2.3.1 Astérisque Le symbole `*` correspond à zéro ou plus de répétitions du schéma précédent. L'expression régulière `a*` signifie : zéro ou plus de répétitions du précédent `a` minuscule. Mais si il se trouve après une liste de caractères alors il s'agit de la répétition de la liste entière. -Par exemple, l'expression régulière `[a-z]*` signifie : n'importe combien de lettres minuscules. +Par exemple, l'expression régulière `[a-z]*` signifie : peu importe la chaine tant qu'il s'agit de lettres minuscules. <pre> "[a-z]*" => T<a href="#learn-regex"><strong>he</strong></a> <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>parked</strong></a> <a href="#learn-regex"><strong>in</strong></a> <a href="#learn-regex"><strong>the</strong></a> <a href="#learn-regex"><strong>garage</strong></a> #21. @@ -155,7 +153,7 @@ Par exemple, l'expression régulière `[a-z]*` signifie : n'importe combien de l [Essayer l'expression régulière](https://regex101.com/r/7m8me5/1) -Le symbole `*` peut être utilisé avec le meta-caractère `.` pour correspondre à n'importe quelle chaîne de caractères `.*`. Le symbole `*` peut être utilisé avec le +Le symbole `*` peut être utilisé avec le meta-caractère `.` pour correspondre à n'importe quelle chaîne de caractères (string) `.*`. Le symbole `*` peut être utilisé avec le caractère espace vide `\s` pour correspondre à une chaîne d'espaces vides. Par exemple, l'expression `\s*cat\s*` signifie : zéro ou plus d'espaces, suivis du caractère `c` minuscule, suivi par le caractère `a` minuscule, suivi par le caractère `t` minuscule, suivi par zéro ou plus d'espaces. @@ -168,7 +166,7 @@ zéro ou plus d'espaces. ### 2.3.2 Le Plus -Le meta-caractère `+` correspond à une ou plusieurs répétitions du caractère précédent. Par exemple, l'expression régulière `c.+t` signifie : la lettre `c` minuscule, suivie par au moins un caractère, suivi par la lettre `t` minuscule. Le `t` coïncide par conséquent avec le dernier `t` de la phrase. +Le meta-caractère `+` correspond à une ou plusieurs répétitions du caractère précédent. Par exemple, l'expression régulière `c.+t` signifie : la lettre `c` minuscule, suivie par au moins un caractère, suivie par la lettre `t` minuscule. Le `t` coïncide par conséquent avec le dernier `t` de la phrase. <pre> "c.+t" => The fat <a href="#learn-regex"><strong>cat sat on the mat</strong></a>. @@ -194,7 +192,7 @@ Le meta-caractère `?` rend le caractère précédent optionnel. Ce symbole perm ## 2.4 Accolades -Dans une expression régulière, les accolades, qui sont aussi appelée quantifieurs, sont utilisées pour spécifier le nombre de fois qu'un +Dans une expression régulière, les accolades, qui sont aussi appelées quantifieurs, sont utilisées pour spécifier le nombre de fois qu'un caractère ou un groupe de caractères peut être répété. Par exemple, l'expression régulière `[0-9]{2,3}` signifie : trouve au moins 2 chiffres mais pas plus de 3 (caractères dans la gamme de 0 à 9). @@ -221,9 +219,9 @@ la virgule l'expression régulière `[0-9]{3}` signifie : trouve exactement 3 ch ## 2.5 Groupement de caractères -Un groupement de caractères est un groupe de sous-schémas qui sont écrits dans des parenthèses `(...)`. Nous avions mentionné plus tôt que, dans une expression régulière, +Un groupement de caractères est un groupe de sous-schémas qui sont écrits entre parenthèses `(...)`. Nous avions mentionné plus tôt que, dans une expression régulière, si nous mettons un quantifieur après un caractère alors le caractère précédent sera répété. Mais si nous mettons un quantifieur après un groupement de caractères alors -il répète le groupement de caractères entier. Par exemple, l'expression régulière `(ab)*` trouve zéro ou plus de répétitions des caractères "ab". +il répète le groupement de caractères en entier. Par exemple, l'expression régulière `(ab)*` trouve zéro ou plus de répétitions des caractères "ab". Nous pouvons aussi utiliser le meta-caractère d'alternation `|` à l'intérieur d'un groupement. Par exemple, l'expression régulière `(c|g|p)ar` signifie : caractère `c` minuscule, `g` ou `p`, suivi par le caractère `a`, suivi par le caractère `r`. @@ -251,7 +249,7 @@ ou le caractère `c` minuscule, suivi par le caractère `a` minuscule, suivit pa L'antislash `\` est utilisé dans les expressions régulières pour échapper (ignorer) le caractère suivant. Cela permet de spécifier un symbole comme caractère à trouver y compris les caractères réservés `{ } [ ] / \ + * . $ ^ | ?`. Pour utiliser un caractère spécial comme caractère à trouver, préfixer `\` avant celui-ci. -Par exemple, l'expression régulière `.` est utilisée pour trouver n'importe quel caractère sauf le retour de ligne. Donc pour trouver `.` dans une string +Par exemple, l'expression régulière `.` est utilisée pour trouver n'importe quel caractère sauf le retour de ligne. Donc pour trouver `.` dans une chaine de caractères (string) l'expression régulière `(f|c|m)at\.?` signifie : la lettre minuscule `f`, `c` ou `m`, suivie par le caractère `a` minuscule, suivi par la lettre `t` minuscule, suivie par le caractère optionnel `.`. @@ -264,15 +262,15 @@ l'expression régulière `(f|c|m)at\.?` signifie : la lettre minuscule `f`, `c` ## 2.8 Ancres Dans les expressions régulières, nous utilisons des ancres pour vérifier si le symbole trouvé est le premier ou dernier symbole de la -string. Il y a 2 types d'ancres : Le premier type est le circonflexe `^` qui cherche si le caractère est le premier -caractère de la string et le deuxième type est le Dollar `$` qui vérifie si le caractère est le dernier caractère de la string. +chaine de caractères (string). Il y a 2 types d'ancres : Le premier type est le circonflexe `^` qui cherche si le caractère est le premier +caractère de la chaine de caractères (string) et le deuxième type est le Dollar `$` qui vérifie si le caractère est le dernier caractère de la chaine de caractères (string). ### 2.8.1 Circonflexe -Le symbole circonflexe `^` est utilisé pour vérifier si un caractère est le premier caractère de la string. Si nous appliquons l'expression régulière -suivante `^a` (si a est le premier symbole) à la string `abc`, ça coïncide. Mais si nous appliquons l'expression régulière `^b` sur cette même string, -ça ne coïncide pas. Parce que dans la string `abc` "b" n'est pas le premier symbole. Regardons une autre expression régulière -`^(T|t)he` qui signifie : le caractère `T` majuscule ou le caractère `t` minuscule est le premier symbole de la string, +Le symbole circonflexe `^` est utilisé pour vérifier si un caractère est le premier caractère de la chaine de caractères (string). Si nous appliquons l'expression régulière +suivante `^a` (si a est le premier symbole) à la chaine de caractères (string) `abc`, ça coïncide. Mais si nous appliquons l'expression régulière `^b` sur cette même chaine de caractères (string), +ça ne coïncide pas. Parce que dans la chaine de caractères (string) `abc` "b" n'est pas le premier symbole. Regardons une autre expression régulière +`^(T|t)he` qui signifie : le caractère `T` majuscule ou le caractère `t` minuscule est le premier symbole de la chaine de caractères (string), suivi par le caractère `h` minuscule, suivi par le caractère `e` minuscule. <pre> @@ -289,9 +287,9 @@ suivi par le caractère `h` minuscule, suivi par le caractère `e` minuscule. ### 2.8.2 Dollar -Le symbole Dollar `$` est utilisé pour vérifier si un caractère est le dernier caractère d'une string. Par exemple, l'expression régulière +Le symbole Dollar `$` est utilisé pour vérifier si un caractère est le dernier caractère d'une chaine de caractères (string). Par exemple, l'expression régulière `(at\.)$` signifie : un caractère `a` minuscule, suivi par un caractère `t` minuscule, suivi par un caractère `.` et tout cela doit être -à la fin de la string. +à la fin de la chaine de caractères (string). <pre> "(at\.)" => The fat c<a href="#learn-regex"><strong>at.</strong></a> s<a href="#learn-regex"><strong>at.</strong></a> on the m<a href="#learn-regex"><strong>at.</strong></a> @@ -324,7 +322,7 @@ les expressions régulières souvent utilisées. Ces abréviations sont les suiv La recherche en avant et en arrière sont un type spécifique appelé ***groupe non-capturant*** (utilisés pour trouver un schéma mais pas pour l'inclure dans la liste de correspondance). Les recherches positives sont utilisées quand nous avons la condition qu'un schéma doit être précédé ou suivi -par un autre schéma. Par exemple, nous voulons tous les chiffres qui sont précédés par le caractère `$` dans la string suivante `$4.44 and $10.88`. +par un autre schéma. Par exemple, nous voulons tous les chiffres qui sont précédés par le caractère `$` dans la chaine de caractères suivante `$4.44 and $10.88`. Nous allons utiliser l'expression régulière suivante `(?<=\$)[0-9\.]*` qui signifie : trouver tous les nombres qui contiennent le caractère `.` et sont précédés par le caractère `$`. Les recherches que nous trouvons dans les expressions régulières sont les suivantes: @@ -352,9 +350,9 @@ la recherche en avant positive qui dit quelle est l'expression à chercher. `The ### 4.2 Recherche en avant négative -La recherche en avant négative est utilisée quand nous avons besoin de trouver une string qui n'est pas suivie d'un schéma. La recherche en avant négative +La recherche en avant négative est utilisée quand nous avons besoin de trouver une chaine de caractères (string) qui n'est pas suivie d'un schéma. La recherche en avant négative est définie de la même manière que la recherche en avant positive mais la seule différence est qu'à la place du signe égal `=` nous utilisons le caractère de négation `!` -i.e. `(?!...)`. Regardons l'expression régulière suivante `[T|t]he(?!\sfat)` qui signifie : trouve tous les mots `The` ou `the` de la string +i.e. `(?!...)`. Regardons l'expression régulière suivante `[T|t]he(?!\sfat)` qui signifie : trouve tous les mots `The` ou `the` de la chaine de caractères (string) qui ne sont pas suivis du mot `fat` précédé d'un espace. <pre> @@ -365,8 +363,8 @@ qui ne sont pas suivis du mot `fat` précédé d'un espace. ### 4.3 Recherche en arrière positive -La recherche en arrière positive est utilisée pour trouver une string précédée d'un schéma. La recherche en arrière positive se note -`(?<=...)`. Par exemple, l'expression régulière `(?<=[T|t]he\s)(fat|mat)` signifie : trouve tous les mots `fat` ou `mat` de la string qui +La recherche en arrière positive est utilisée pour trouver une chaine de caractères (string) précédée d'un schéma. La recherche en arrière positive se note +`(?<=...)`. Par exemple, l'expression régulière `(?<=[T|t]he\s)(fat|mat)` signifie : trouve tous les mots `fat` ou `mat` de la chaine de caractères (string) qui se trouve après le mot `The` ou `the`. <pre> @@ -377,8 +375,8 @@ se trouve après le mot `The` ou `the`. ### 4.4 Recherche en arrière négative -La recherche en arrière négative est utilisée pour trouver une string qui n'est pas précédée d'un schéma. La recherche en arrière négative se note -`(?<!...)`. Par exemple, l'expression régulière `(?<!(T|t)he\s)(cat)` signifie : trouve tous les mots `cat` de la string qui +La recherche en arrière négative est utilisée pour trouver une chaine de caractères (string) qui n'est pas précédée d'un schéma. La recherche en arrière négative se note +`(?<!...)`. Par exemple, l'expression régulière `(?<!(T|t)he\s)(cat)` signifie : trouve tous les mots `cat` de la chaine de caractères (string) qui ne se trouvent pas après le mot `The` ou `the`. <pre> @@ -395,7 +393,7 @@ dans n'importe quel ordre et combinaison et font partie intégrante de la RegExp |Drapeau|Description| |:----:|----| |i|Insensible à la casse : Définit que la correspondance sera insensible à la casse.| -|g|Recherche globale : Recherche la correspondance dans la string entière.| +|g|Recherche globale : Recherche la correspondance dans la chaine de caractères (string) entière.| |m|Multiligne : Meta-caractère ancre qui agit sur toutes les lignes.| ### 5.1 Insensible à la casse @@ -403,7 +401,7 @@ dans n'importe quel ordre et combinaison et font partie intégrante de la RegExp Le modifieur `i` est utilisé pour faire une correspondance insensible à la casse. Par exemple, l'expression régulière `/The/gi` signifie : la lettre `T` majuscule, suivie par le caractère `h` minuscule, suivi par le caractère `e` minuscule. Et à la fin de l'expression régulière, le drapeau `i` dit au moteur d'expression régulière d'ignorer la casse. Comme vous pouvez le voir, nous mettons aussi un drapeau `g` parce que nous voulons chercher le schéma dans -la string entière. +la chaine de caractères (string) entière. <pre> "The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. @@ -419,9 +417,9 @@ la string entière. ### 5.2 Correspondance globale -Le modifieur `g` est utilisé pour faire une recherche globale (trouver toutes les strings plutôt que de s'arrêter à la première correspondance ). Par exemple, +Le modifieur `g` est utilisé pour faire une recherche globale (trouver toutes les chaines de caractères (string) plutôt que de s'arrêter à la première correspondance ). Par exemple, l'expression régulière `/.(at)/g` signifie : n'importe quel caractère sauf le retour de ligne, suivi par le caractère `a` minuscule, suivi par le caractère -`t` minuscule. Grâce au drapeau `g` à la fin de l'expression régulière maintenant il trouvera toutes les correspondances de toute la string. +`t` minuscule. Grâce au drapeau `g` à la fin de l'expression régulière maintenant il trouvera toutes les correspondances de toute la chaine de caractères (string). <pre> "/.(at)/" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the mat. @@ -438,9 +436,9 @@ l'expression régulière `/.(at)/g` signifie : n'importe quel caractère sauf le ### 5.3 Multilignes Le modifieur `m` est utilisé pour trouver une correspondance multiligne. Comme mentionné plus tôt, les ancres `(^, $)` sont utilisés pour vérifier si le schéma -se trouve au début ou à la fin de la string. Mais si nous voulons que l'ancre soit sur chaque ligne nous utilisons le drapeau `m`. Par exemple, l'expression régulière +se trouve au début ou à la fin de la chaine de caractères (string). Mais si nous voulons que l'ancre soit sur chaque ligne nous utilisons le drapeau `m`. Par exemple, l'expression régulière `/at(.)?$/gm` signifie : le caractère `a` minuscule, suivi par le caractère `t` minuscule, suivi par optionnellement n'importe quel caractère à part le retour de ligne. -Grâce au drapeau `m` maintenant le moteur d'expression régulière trouve le schéma à chaque début de ligne dans la string. +Grâce au drapeau `m` maintenant le moteur d'expression régulière trouve le schéma à chaque début de ligne dans la chaine de caractères (string). <pre> "/.at(.)?$/" => The fat From 591de7b1926311defdc441dc88e8178cf4dbe084 Mon Sep 17 00:00:00 2001 From: chroju <chor.chroju@gmail.com> Date: Mon, 28 Aug 2017 01:24:13 +0900 Subject: [PATCH 36/36] Update README-ja.md (#91) * Reflect the update in 499de93acd * Reflect the update in c38baf18f4 * Reflect the update in 17571a9d82 * Reflect the update in a3a7b3ac3c --- README-ja.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/README-ja.md b/README-ja.md index ea0b074..ca94528 100644 --- a/README-ja.md +++ b/README-ja.md @@ -193,6 +193,7 @@ シンボル `+` は直前の文字が 1 個以上続くパターンにマッチします。 例えば `c.+t` という正規表現は小文字の `c` の後に 任意の 1 文字以上が続き、さらに `t` が続くことを意味します。 +この `t` は、その文における最後の `t` がマッチします。 <pre> "c.+t" => The fat <a href="#learn-regex"><strong>cat sat on the mat</strong></a>. @@ -220,6 +221,7 @@ [正規表現の動作確認をする](https://regex101.com/r/kPpO2x/1) ## 2.4 括弧 +この`t`は、その文における最後の`t`であることが明確である必要があります。 正規表現における括弧は数量子とも呼ばれますが、文字列がいくつ現れるかを示すために使用されます。 例えば、`[0-9]{2,3}` という正規表現は 2 桁以上 3 桁以下の数字 @@ -359,7 +361,7 @@ ## 4. 前後参照 -しばしば前後参照とも呼ばれる先読みと後読みは **非キャプチャグループ** +先読みと後読み(前後参照とも呼ばれます)は **非キャプチャグループ** (パターンのマッチングはするがマッチングリストには含まれない)という 特殊な扱いがなされる機能です。 前後参照はあるパターンが別のあるパターンよりも先行または後続して現れることを示すために使用されます。 @@ -382,12 +384,12 @@ 肯定的な先読みを定義するには括弧を使用します。 その括弧の中で疑問符と等号を合わせて `(?=...)` のようにします。 先読みのパターンは括弧の中の等号の後に記述します。 -例えば `[T|t]he(?=\sfat)` という正規表現は小文字の `t` か大文字の `T` のどちらかの後に `h`, `e` が続きます。 +例えば `(T|t)he(?=\sfat)` という正規表現は小文字の `t` か大文字の `T` のどちらかの後に `h`, `e` が続きます。 括弧内で肯定的な先読みを定義していますが、これは `The` または `the` の後に `fat` が続くことを表しています。 <pre> -"[T|t]he(?=\sfat)" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. +"(T|t)he(?=\sfat)" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. </pre> [正規表現の動作確認をする](https://regex101.com/r/IDDARt/1) @@ -397,11 +399,11 @@ 否定的な先読みはあるパターンが後続しない全てのマッチング文字列を取得するために使用します。 否定的な先読みは肯定的な先読みと同じように定義しますが、 `=` の代わりに `!` を使うところが唯一の違いで、`(?!...)` と記述します。 -次の正規表現 `[T|t]he(?!\sfat)` について考えてみます。 +次の正規表現 `(T|t)he(?!\sfat)` について考えてみます。 これはスペースを挟んで `fat` が後続することがない全ての `The` または `the` を得ることができます。 <pre> -"[T|t]he(?!\sfat)" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat. +"(T|t)he(?!\sfat)" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat. </pre> [正規表現の動作確認をする](https://regex101.com/r/V32Npg/1) @@ -410,11 +412,11 @@ 肯定的な後読みは特定のパターンが先行するような文字列を得るために使用します。 定義の仕方は `(?<=...)` とします。 -例えば `(?<=[T|t]he\s)(fat|mat)` という正規表現は +例えば `(?<=(T|t)he\s)(fat|mat)` という正規表現は `The` または `the` の後に続く全ての `fat` または `mat` が取得できます。 <pre> -"(?<=[T|t]he\s)(fat|mat)" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the <a href="#learn-regex"><strong>mat</strong></a>. +"(?<=(T|t)he\s)(fat|mat)" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the <a href="#learn-regex"><strong>mat</strong></a>. </pre> [正規表現の動作確認をする](https://regex101.com/r/avH165/1) @@ -426,7 +428,7 @@ 例えば `(?<!(T|t)he\s)(cat)` は `The` または `the` に続いていない全ての `cat` が取得できます。 <pre> -"(?<![T|t]he\s)(cat)" => The cat sat on <a href="#learn-regex"><strong>cat</strong></a>. +"(?<!(T|t)he\s)(cat)" => The cat sat on <a href="#learn-regex"><strong>cat</strong></a>. </pre> [正規表現の動作確認をする](https://regex101.com/r/8Efx5G/1) @@ -466,8 +468,8 @@ 修飾子 `g` はグローバル検索(最初のマッチ列を検索する代わりに全マッチ列を検索する)を 行うために使用します。 例えば `/.(at)/g` という正規表現は、改行を除く任意の文字列の後に -小文字の `a`, `t` が続きます。正規表現の最後にフラグ `g` を渡すことで -入力文字列内の全マッチ列を検索するようにしています。 +小文字の `a`, `t` が続きます。正規表現の最後にフラグ `g` を渡すことで、 +最初のマッチだけではなく(これがデフォルトの動作です)、入力文字列内の全マッチ列を検索するようにしています。 <pre> "/.(at)/" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the mat.