⊗jsSpRELAB 133 of 294 menu

Búsqueda positiva y negativa en expresiones regulares de JavaScript

A veces es necesario resolver una tarea de este tipo: encontrar la cadena 'aaa' y reemplazarla por '!', pero solo si después de 'aaa' hay 'x', y el propio 'x' no debe ser reemplazado. Si intentamos resolver la tarea 'directamente', no tendremos éxito:

'aaax baaa'.replace(/aaax/g, '!'); // devuelve '! baaa', pero queríamos '!x baaa'

Búsqueda hacia adelante

Para resolver la tarea, se necesita una forma de decir que 'x' no debe ser reemplazado. Esto se hace usando corchetes especiales (?= ), que solo buscan, pero no capturan el contenido.

Estos corchetes se llaman búsqueda positiva hacia adelante. Positiva - porque 'x' (en nuestro caso) debe estar presente - solo entonces ocurrirá el reemplazo.

Apliquemos estos corchetes para resolver nuestra tarea:

'aaax aaab'.replace(/aaa(?=x)/g, '!'); // devuelve '!x aaab'

También existe la búsqueda negativa hacia adelante - (?! ) - que, por el contrario, dice que algo no debe estar presente. En el siguiente ejemplo, el reemplazo ocurrirá solo si después de 'aaa' NO hay 'x':

'aaax aaab'.replace(/aaa(?!x)/g, '!'); // devuelve 'aaax !b'

Búsqueda hacia atrás

De manera similar, existe la búsqueda positiva hacia atrás - (?<= ). En el siguiente ejemplo, el reemplazo ocurrirá solo si antes de 'aaa' hay 'x':

'xaaa'.replace(/(?<=x)aaa/g, '!'); // devuelve 'x!'

Y también existe la búsqueda negativa hacia atrás - (?<! ). En el siguiente ejemplo, el reemplazo ocurrirá solo si antes de 'aaa' no hay 'x':

'baaa'.replace(/(?<!x)aaa/g, '!'); // devuelve 'b!'

Tareas prácticas

Se da una cadena que contiene nombres de funciones:

let str = 'func1() func2() func3()';

Obtenga un array con los nombres de las funciones de la cadena.

Se da una cadena con una etiqueta:

let str = '<a href="" class="eee" id="zzz">';

Obtenga un array con los nombres de los atributos de esta etiqueta.

Se da una cadena con variables:

let str = '$aaa $bbb $ccc xxxx';

Obtenga las subcadenas que están precedidas por el símbolo del dólar.

idkaroessw