- Notifications
You must be signed in to change notification settings - Fork230
Update article.md#385
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Merged
Uh oh!
There was an error while loading.Please reload this page.
Merged
Changes fromall commits
Commits
Show all changes
14 commits Select commitHold shift + click to select a range
99a9d12 Update article.md
JesusZScf7aad4 Update 9-regular-expressions/14-regexp-lookahead-lookbehind/article.md
joaquinelio618da2d Update 9-regular-expressions/14-regexp-lookahead-lookbehind/article.md
joaquinelio31b6fb8 Update 9-regular-expressions/14-regexp-lookahead-lookbehind/article.md
joaquinelio10718dd Update 9-regular-expressions/14-regexp-lookahead-lookbehind/article.md
joaquinelio0f6635c Apply suggestions from code review
joaquinelio247e7e5 Merge branch 'master' into patch-1
joaquineliof322171 enajenado
joaquinelioc1080c5 Merge branch 'master' into patch-1
joaquinelio5dc67c9 Merge branch 'master' into patch-1
joaquineliofd04542 Update article.md
joaquinelio7abc64a Update article.md
joaquineliocc56b85 looks
joaquinelio62aca34 Update article.md
joaquinelioFile filter
Filter by extension
Conversations
Failed to load comments.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Jump to file
Failed to load files.
Loading
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
116 changes: 58 additions & 58 deletions9-regular-expressions/14-regexp-lookahead-lookbehind/article.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,130 +1,130 @@ | ||
| # Lookaheady lookbehind (revisar delante/detrás) | ||
| A veces necesitamos buscar únicamente aquellas coincidencias donde un patrón es precedido o seguido por otro patrón. | ||
| Existe una sintaxis especial para eso llamadas "lookahead"y "lookbehind" ("ver delante" y "ver detrás"), juntas son conocidas como "lookaround" ("ver alrededor"). | ||
| Para empezar, busquemos el precio de la cadena siguiente`subject:1pavo cuesta 30€`.Eso es: un número, seguido por el signo`subject:€`. | ||
| ## Lookahead | ||
| La sintaxis es: `pattern:X(?=Y)`. Esto significa "buscar`pattern:X`,pero considerarlo una coincidencia solo si es seguido por`pattern:Y`".Puede haber cualquier patrón en`pattern:X`y `pattern:Y`. | ||
| Para un número entero seguido de `subject:€`,la expresión regular será `pattern:\d+(?=€)`: | ||
| ```js run | ||
| let str = "1pavo cuesta 30€"; | ||
| alert( str.match(/\d+(?=€)/) ); // 30,el número 1es ignorado porque no está seguido de € | ||
| ``` | ||
| Tenga en cuenta que "lookahead" es solamente una prueba, lo contenido en los paréntesis `pattern:(?=...)`no es incluido en el resultado `match:30`. | ||
| Cuando buscamos`pattern:X(?=Y)`,el motor de expresión regular encuentra`pattern:X`y luego verifica si existe `pattern:Y`inmediatamente después de él. Si no existe, entonces la coincidencia potencial es omitida y la búsqueda continúa. | ||
| Es posible realizar pruebas más complejas, por ejemplo`pattern:X(?=Y)(?=Z)`significa: | ||
| 1.Encuentra `pattern:X`. | ||
| 2.Verifica si `pattern:Y`está inmediatamente después de`pattern:X` (omite si no es así). | ||
| 3.Verifica si `pattern:Z`está también inmediatamente después de`pattern:X` (omite si no es así). | ||
| 4.Si ambas verificaciones se cumplen, el`pattern:X`es una coincidencia. De lo contrario continúa buscando. | ||
| En otras palabras, dicho patrón significa que estamos buscando por `pattern:X`seguido de `pattern:Y`y `pattern:Z`al mismo tiempo. | ||
| Eso es posible solamente si los patrones`pattern:Y`y `pattern:Z`no se excluyen mutuamente. | ||
| Por ejemplo, `pattern:\d+(?=\s)(?=.*30)`busca un `pattern:\d+`que sea seguido por un espacio `pattern:(?=\s)` y que también tenga un`30`en algún lugar después de él `pattern:(?=.*30)`: | ||
| ```js run | ||
| let str = "1pavo cuesta 30€"; | ||
| alert( str.match(/\d+(?=\s)(?=.*30)/) ); // 1 | ||
| ``` | ||
| En nuestra cadena eso coincide exactamente con el número `1`. | ||
| ##Lookahead negativo | ||
| Digamos que queremos una cantidad, no un precio de la misma cadena. Eso es el número`pattern:\d+` NO seguido por `subject:€`. | ||
| Para eso se puede aplicar un "lookahead negativo". | ||
| La sintaxis es: `pattern:X(?!Y)`,que significa "busca `pattern:X`,pero solo si no es seguido por `pattern:Y`". | ||
| ```js run | ||
| let str = "2pavos cuestan 60€"; | ||
| alert( str.match(/\d+\b(?!€)/g) ); // 2 (el precio es omitido) | ||
| ``` | ||
| ## Lookbehind | ||
| "lookahead" permite agregar una condición para "lo que sigue". | ||
| "Lookbehind" es similar. Permite coincidir un patrón solo si hay algo anterior a él. | ||
| La sintaxis es: | ||
| -Lookbehind positivo: `pattern:(?<=Y)X`,coincide `pattern:X`,pero solo si hay`pattern:Y`antes de él. | ||
| -Lookbehind negativo: `pattern:(?<!Y)X`,coincide `pattern:X`,pero solo sinohay`pattern:Y`antes de él. | ||
| Por ejemplo, cambiemos el precio a dólares estadounidenses. El signo de dólar usualmente va antes del número, entonces para buscar`$30`usaremos`pattern:(?<=\$)\d+`: una cantidad precedida por`subject:$`: | ||
| ```js run | ||
| let str = "1pavo cuesta $30"; | ||
| //el signo de dólar se ha escapado \$ | ||
| alert( str.match(/(?<=\$)\d+/) ); // 30 (omite los números aislados) | ||
| ``` | ||
| Y si necesitamos la cantidad (un número no precedida por`subject:$`), podemos usar "lookbehindnegativo"`pattern:(?<!\$)\d+`: | ||
| ```js run | ||
| let str = "2pavos cuestan $60"; | ||
| alert( str.match(/(?<!\$)\b\d+/g) ); // 2 (el precio es omitido) | ||
| ``` | ||
| ##Atrapando grupos | ||
| Generalmente, los contenidos dentro de los paréntesis de "lookaround" (ver alrededor) no se convierten en parte del resultado. | ||
| Ejemplo en el patrón `pattern:\d+(?=€)`,el signo`pattern:€` no es capturado como parte de la coincidencia. Eso es esperado: buscamos un número`pattern:\d+`,mientras `pattern:(?=€)`es solo una prueba que indica que debe ser seguida por `subject:€`. | ||
| Pero en algunas situaciones nosotros podríamos querer capturar también la expresión en "lookaround", o parte de ella. Eso es posible: solo hay que rodear esa parte con paréntesis adicionales. | ||
| En los ejemplos de abajo el signo de divisa`pattern:(€|kr)`es capturado junto con la cantidad: | ||
| ```js run | ||
| let str = "1pavo cuesta 30€"; | ||
| let regexp = /\d+(?=(€|kr))/; //paréntesisextraalrededor de €|kr | ||
| alert( str.match(regexp) ); // 30, € | ||
| ``` | ||
| Lo mismo para "lookbehind": | ||
| ```js run | ||
| let str = "1pavo cuesta $30"; | ||
| let regexp = /(?<=(\$|£))\d+/; | ||
| alert( str.match(regexp) ); // 30, $ | ||
| ``` | ||
| ##Resumen | ||
| Lookaheady lookbehind (en conjunto conocidos como "lookaround")son útiles cuando queremos hacer coincidir algo dependiendo del contexto antes/después. | ||
| Para expresiones regulares simples podemos hacer lo mismo manualmente. Esto es: coincidir todo, en cualquier contexto, y luego filtrar por contexto en el bucle. | ||
| Recuerda, `str.match` (sin el indicador`pattern:g`)y `str.matchAll` (siempre) devuelven las coincidencias como un array con la propiedad`index`, así que sabemos exactamente dónde están dentro del texto y podemos comprobar su contexto. | ||
| Pero generalmente "lookaround" es más conveniente. | ||
| Tipos de "lookaround": | ||
| |Patrón | Tipo |Coincidencias | | ||
| |--------------------|------------------|---------| | ||
| | `X(?=Y)` | lookaheadpositivo| `pattern:X`si está seguido por `pattern:Y` | | ||
| | `X(?!Y)` | lookaheadnegativo| `pattern:X`si no está seguido por `pattern:Y` | | ||
| | `(?<=Y)X` | lookbehindpositivo| `pattern:X`si está después de `pattern:Y` | | ||
| | `(?<!Y)X` | lookbehindnegativo| `pattern:X`si no está después de `pattern:Y` | |
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.