diff options
author | Florian Merz <me@fiji-flo.de> | 2021-02-11 14:46:50 +0100 |
---|---|---|
committer | Florian Merz <me@fiji-flo.de> | 2021-02-11 14:46:50 +0100 |
commit | a55b575e8089ee6cab7c5c262a7e6db55d0e34d6 (patch) | |
tree | 5032e6779a402a863654c9d65965073f09ea4182 /files/es/web/javascript/guide/regular_expressions/assertions | |
parent | 8260a606c143e6b55a467edf017a56bdcd6cba7e (diff) | |
download | translated-content-a55b575e8089ee6cab7c5c262a7e6db55d0e34d6.tar.gz translated-content-a55b575e8089ee6cab7c5c262a7e6db55d0e34d6.tar.bz2 translated-content-a55b575e8089ee6cab7c5c262a7e6db55d0e34d6.zip |
unslug es: move
Diffstat (limited to 'files/es/web/javascript/guide/regular_expressions/assertions')
-rw-r--r-- | files/es/web/javascript/guide/regular_expressions/assertions/index.html | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/files/es/web/javascript/guide/regular_expressions/assertions/index.html b/files/es/web/javascript/guide/regular_expressions/assertions/index.html new file mode 100644 index 0000000000..b822cdd2bf --- /dev/null +++ b/files/es/web/javascript/guide/regular_expressions/assertions/index.html @@ -0,0 +1,247 @@ +--- +title: Aserciones +slug: Web/JavaScript/Guide/Regular_Expressions/Aserciones +tags: + - Aserciones + - Expresiones Regulares + - Guía + - JavaScript + - Referencia + - regex +translation_of: Web/JavaScript/Guide/Regular_Expressions/Assertions +--- +<p>{{jsSidebar("JavaScript Guide")}}</p> + +<p>Las aserciones incluyen límites, que indican el comienzo y el final de líneas y palabras, y otros patrones que indican de alguna manera que el reconocimiento es posible (incluidas las expresiones anticipadas, condicionales e inversas).</p> + +<div>{{EmbedInteractiveExample("pages/js/regexp-assertions.html", "taller")}}</div> + +<h2 id="Tipos">Tipos</h2> + +<div class="hidden">La siguiente sección también está duplicada en {{JSxRef("../Guide/Regular_Expressions/Hoja_de_referencia", "esta hoja de trucos")}}. No olvides editarla también, ¡gracias!</div> + +<h3 id="Aserciones_de_tipo_límite">Aserciones de tipo límite</h3> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Caracteres</th> + <th scope="col">Significado</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>^</code></td> + <td> + <p>Coincide con el comienzo de la entrada. Si el indicador multilínea se establece en <code>true</code>, también busca inmediatamente después de un caracter de salto de línea. Por ejemplo, <code>/^A/</code> no coincide con la "A" en "alias A", pero coincide con la primera "A" en "Alias A".</p> + + <div class="blockIndicator note"> + <p>Este caracter tiene un significado diferente cuando aparece al comienzo de un {{JSxRef("../Guide/Regular_Expressions/Grupos_y_rangos", "grupo")}}.</p> + </div> + </td> + </tr> + <tr> + <td><code>$</code></td> + <td> + <p>Coincide con el final de la entrada. Si el indicador multilínea se establece en <code>true</code>, también busca hasta inmediatamente antes de un caracter de salto de línea. Por ejemplo, <code>/r$/</code> no coincide con la "r" en "espera", pero sí en "esperar".</p> + </td> + </tr> + <tr> + <td><code>\b</code></td> + <td> + <p>Marca el límite de una palabra. Esta es la posición en la que un caracter de palabra no va seguido o precedido por otro caracter de palabra, por ejemplo, entre una letra y un espacio. Ten en cuenta que el límite de una palabra encontrada no se incluye en el resultado. En otras palabras, la longitud de un límite de palabra encontrada es cero.</p> + + <p>Ejemplos:</p> + + <ul> + <li><code>/\bl/</code> encuentra la "l" en "luna".</li> + <li><code>/un\b/</code> no concuerda con "un" en "luna", porque "un" va seguido de "a", que es un carácter de palabra.</li> + <li><code>/una\b/</code> coincide con "una" en "luna", porque "una" es el final de la cadena, por lo tanto no va seguido de un carácter de palabra.</li> + <li><code>/\w\b\w/</code> nunca encontrará con nada, porque un caracter de palabra nunca puede ir seguido de un caracter que no sea de palabra y otro de palabra.</li> + </ul> + + <p>Para hacer coincidir un carácter de retroceso (<code>[\b]</code>), consulta {{JSxRef("../Guide/Regular_Expressions/Clases_de_caracteres", "Clases de caracteres")}}.</p> + </td> + </tr> + <tr> + <td><code>\B</code></td> + <td> + <p>Coincide con un límite sin palabra. Esta es una posición en la que el caracter anterior y siguiente son del mismo tipo: ambos deben ser palabras o ambos deben ser no palabras, por ejemplo, entre dos letras o entre dos espacios. El principio y el final de una cadena se consideran no palabras. Igual que el límite de palabras encontradas, el límite sin palabras reconocidas tampoco se incluye en el resultado. Por ejemplo, <code>/\Bme/</code> coincide con "me" en "al mediodía", y <code>/ay\B/</code> coincide con "ay" en "posiblemente ayer".</p> + </td> + </tr> + </tbody> +</table> + +<h3 id="Otras_aserciones">Otras aserciones</h3> + +<div class="blockIndicator note"> +<p><strong>Nota</strong>: El caracter <code>?</code> también se puede utilizar como cuantificador.</p> +</div> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Caracteres</th> + <th scope="col">Significado</th> + </tr> + </thead> + <tbody> + <tr> + <td><code>x(?=y)</code></td> + <td> + <p><strong>Aserción anticipada</strong>: Coincide con "x" solo si "x" va seguida de "y". Por ejemplo, <code>/Jack(?=Sprat)/</code> coincide con "Jack" solo si va seguido de "Sprat".<br> + <code>/Jack(?=Sprat|Frost)/</code> coincide con "Jack" solo si va seguido de "Sprat" o "Frost". Sin embargo, ni "Sprat" ni "Frost" forman parte del resultado.</p> + </td> + </tr> + <tr> + <td><code>x(?!y)</code></td> + <td> + <p><strong>Aserción anticipada negativa</strong>: Coincide con "x" solo si "x" <span> no está seguida de </span>"y"<span>.</span> Por ejemplo, <code>/\d+(?!\.)/</code><span> coincide con un número solo si no va seguido de un punto decimal. </span><code>/\d+(?!\.)/.exec('3.141')</code> coincide con "141" pero no con "3."</p> + </td> + </tr> + <tr> + <td><code>(?<=y)x</code></td> + <td> + <p><strong>Aserción de búsqueda inversa</strong>: coincide con "x" solo si "x" está precedida por "y". Por ejemplo, <code>/(?<=Jack)Sprat/</code><span> coincide con "Sprat" sólo si va precedida de "Jack". </span><code>/(?<=Jack|Tom)Sprat/</code> coincide con "Sprat" solo si va precedido de "Jack" o "Tom". Sin embargo, ni "Jack" ni "Tom" forman parte del resultado.</p> + </td> + </tr> + <tr> + <td><code>(?<!y)x</code></td> + <td> + <p><strong>Aserción de búsqueda inversa negativa</strong>: coincide con "x" solo si "x" <em>no</em> está precedida por "y". Por ejemplo, <code>/(?<!-)\d+/</code><span> coincide con un número solo si no está precedido por un signo de menos. </span><code>/(? coincide con "3". <code>/(?<!-)\d+/.exec('-3')</code> no se encuentra la coincidencia porque el número está precedido por el signo menos.</code></p> + </td> + </tr> + </tbody> +</table> + +<h2 id="Ejemplos">Ejemplos</h2> + +<h3 id="Ejemplo_de_descripción_de_tipo_límite">Ejemplo de descripción de tipo límite</h3> + +<pre class="brush: js notranslate">// Usa límites Regex para arreglar cadenas con errores. +let multilineaIncorrecta = `tey, la brillante manzena vered +toy cuelga en una rama del arbol vered`; + +// 1) Usa ^ para corregir la coincidencia al principio de la cadena y justo después de la nueva línea. +multilineaIncorrecta = multilineaIncorrecta.replace(/^t/gim,'h'); +console.log(1, multilineaIncorrecta); // corrige 'tey', 'toy' => 'hey', 'hoy'. + +// 2) Usa $ para arreglar el reconocimiento al final del texto. +multilineaIncorrecta = multilineaIncorrecta.replace(/ed$/gim,'de'); +console.log(2, multilineaIncorrecta); // corrige 'vered' => 'verde'. + +// 3) Usa \b para encontrar los caracteres justo en el borde entre una palabra y un espacio. +multilineaIncorrecta = multilineaIncorrecta.replace(/\ba/gim,'á'); +console.log(3, multilineaIncorrecta); // corrige 'arbol' sin tocar nada más. + +// 4) Usa \B para encontrar los caracteres dentro de los bordes de una entidad. +multilineaCorrecta = multilineaIncorrecta.replace(/\Ben/gim,'an'); +console.log(4, multilineaCorrecta); // corrige 'manzena' pero no toca 'en'. +</pre> + +<h3 id="Busca_al_comienzo_de_la_entrada_usando_un_caracter_de_control">Busca al comienzo de la entrada usando un caracter de control <code>^</code></h3> + +<p>Usa <code>^</code> para hacer coincidir al comienzo de la entrada. En este ejemplo, podemos obtener las frutas que comienzan con 'A' con una expresión regular <code>/^A/</code>. Para seleccionar las frutas adecuadas, podemos utilizar el método {{JSxRef("Objetos_globales/Array/filter", "filter")}} con un {{JSxRef("Funciones/Arrow_functions", "función flecha")}}.</p> + +<pre class="brush: js notranslate">let frutas = ["Manzana", "Sandía", "Naranja", "Aguacate", "Fresa", "Melón"]; + +// Selecciona frutas que comiencen con 'M' por la Regex /^M/. +// Aquí se usa el símbolo de control '^' solo en un rol: Reconocer desde el inicio una entrada. + +let frutasEmpiezanConM = frutas.filter(fruta => /^M/.test(fruta)); +console.log(frutasEmpiezanConM); // [ 'Manzana', 'Melón' ]</pre> + +<p>En el segundo ejemplo, <code>^</code> se usa tanto para hacer coincidir al comienzo de la entrada como para crear conjuntos de caracteres negados o complementados cuando se usa dentro de {{JSxRef("../Guide/Regular_Expressions/Grupos_y_rangos", "grupos")}}.</p> + +<pre class="brush: js notranslate">let frutas = ["Manzana", "Sandía", "Naranja", "Aguacate", "Fresa", "Melón"]; + +// Seleccionar frutas que no comiencen por 'M' con la regexp /^[^M]/. +// En este ejemplo, se representan dos significados del símbolo de control '^': +// 1) Inicio coincidente de la entrada +// 2) Un conjunto de caracteres negado o complementado: [^M] +// Es decir, coincide con cualquier cosa que no esté encerrado entre los corchetes. + +let frutasNoEmpiezanConM = frutas.filter(fruta => /^[^M]/.test(fruta)); + +console.log(frutasNoEmpiezanConM); // [ "Sandía", "Naranja", "Aguacate", "Fresa" ]</pre> + +<h3 id="Reconoce_el_límite_de_palabra">Reconoce el límite de palabra</h3> + +<pre class="brush: js notranslate">let frutasConDescripcion = ["Manzana roja", "Piña amarilla", "Aguacate verde"]; + +// Selecciona descripciones que contengan terminaciones de palabras 'ja' o 'de': +let deJaSeleccion = frutasConDescripcion.filter(descr => /(de|ja)\b/.test(descr)); + +console.log(deJaSeleccion); // ["Manzana roja", "Aguacate verde"]</pre> + +<h3 id="Aserción_anticipada">Aserción anticipada</h3> + +<pre class="brush: js notranslate">// JS aserción anticipada x(?=Y) + +let regex = /Primer(?= prueba)/g; + +console.log('Primer prueba'.match(regex)); // [ 'Primer' ] +console.log('Primer melocotón'.match(regex)); // null +console.log('Esta es mi Primer prueba en un año.'.match(regex)); // [ 'Primer' ] +console.log('Este es mi Primer melocotón en un mes.'.match(regex)); // null +</pre> + +<h3 id="Aserción_anticipada_negativa_básica">Aserción anticipada negativa básica</h3> + +<p>Por ejemplo, <code>/\d+(?!\.)/</code><span> coincide con un número solo si no va seguido de un punto decimal. </span><code>/\d+(?!\.)/.exec('3.141')</code> coincide con "141" pero no con "3."</p> + +<pre class="brush: js notranslate">console.log(/\d+(?!\.)/g.exec('3.141')); // [ '141', index: 2, input: '3.141' ] +</pre> + +<h3 id="Diferente_significado_del_uso_de_la_combinación_!_en_aserciones_y_rangos">Diferente significado del uso de la combinación '?!' en aserciones y rangos</h3> + +<p>Diferente significado del uso de la combinación <code>?!</code> en {{JSxRef("../Guide/Regular_Expressions/Aserciones", "Aserciones")}} <code>/x(?!y)/</code> y de <code>[^?!]</code> en {{JSxRef("../Guide/Regular_Expressions/Grupos_y_rangos", "Rangos")}}.</p> + +<pre class="brush: js notranslate">let naranjaNoLimon = "¿Quieres beber jugo de naranja? ¡Sí, no quiero tomar jugo de limón!"; + +// Diferente significado del uso de la combinación '?!' en Aserciones /x(?!y)/ y [^?!] en Rangos. +let regexNoSeleccionaLimon = /[^?!]+beber(?! de limón)[^?!]+[?!]/gi +console.log(naranjaNoLimon.match(regexNoSeleccionaLimon)); // [ '¿Quieres beber jugo de naranja?' ] + +let regexNoSeleccionaNaranja = /[^?!]+tomar(?! de naranja)[^?!]+[?!]/gi +console.log(naranjaNoLimon.match(regexNoSeleccionaNaranja)); // [ ' ¡Sí, no quiero tomar jugo de limón!' ] +</pre> + +<h3 id="Aserción_inversa">Aserción inversa</h3> + +<pre class="brush: js notranslate">let naranjas = ['naranja madura A', 'naranja verde B', 'naranja madura C',]; + +let naranjas_maduras = naranjas.filter(fruta => fruta.match(/(?<=naranja) madura/)); +console.log(naranjas_maduras); // [ 'naranja madura A ', 'naranja madura C' ] +</pre> + +<h2 id="Especificaciones">Especificaciones</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Especificación</th> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-assertion', 'RegExp: Aserciones')}}</td> + </tr> + </tbody> +</table> + +<h2 id="Compatibilidad_del_navegador">Compatibilidad del navegador</h2> + +<p>Para obtener información sobre la compatibilidad del navegador, consulta la {{JSxRef("../Guide/Regular_Expressions", "tabla principal de compatibilidad de expresiones regulares", "#Compatibilidad_del_navegador")}}.</p> + +<h2 id="Ve_también">Ve también</h2> + +<ul> + <li>{{JSxRef("../Guide/Regular_Expressions", "Guía de expresiones regulares")}} + <ul> + <li>{{JSxRef("../Guide/Regular_Expressions/Character_Classes", "Clases de caracteres")}}</li> + <li>{{JSxRef("../Guide/Regular_Expressions/Cuantificadores", "Cuantificadores")}}</li> + <li>{{JSxRef("../Guide/Regular_Expressions/Escapes_de_propiedades_Unicode", "Escapes de propiedades Unicode")}}</li> + <li>{{JSxRef("../Guide/Regular_Expressions/Grupos_y_rangos", "Grupos y rangos")}}</li> + </ul> + </li> + <li>{{JSxRef("Objetos_globales/RegExp", "El constructor RegExp()")}}</li> +</ul> |