function strip(match, before, after) {
  return before && after ? ' ' : ''
}

var regex = /(^|\s)(?:y|x)(\s|$)/g

var str = ('x 1 y 2 x 3 y').replace(regex, strip)
console.log(str)

str = ('x y 2 x 3 y').replace(regex, strip)
console.log(str)

El objetivo es eliminar todas las apariciones de "x" e "y".

El primer ejemplo funciona como se esperaba, pero el segundo no.

Los requisitos:

  • La solución debe permitir eliminar palabras de cualquier longitud.

  • Nunca debe haber más de 1 espacio entre palabras.

  • Evite eliminar palabras que contengan "x" o "y" (deben ser iguales).

¿Puedo solucionar esto con replace o necesito una solución diferente?

0
aleclarson 28 feb. 2018 a las 05:02

3 respuestas

La mejor respuesta

No puede hacer coincidir el mismo personaje dos veces (el carácter de espacio que está al final de una coincidencia, no puede coincidir una vez más al comienzo de la siguiente coincidencia cuando las subcadenas son consecutivas).

Una posible forma de evitar esto es cambiar ( |$) a una búsqueda anticipada que verifique el espacio sin consumirlo. Pero también debe cambiar su enfoque, ya que debe recortar los espacios restantes eventuales al final o al principio:

var regex = /(^|\s)(?:y|x)(?!\S)/g;
var str = 'x y 2 x 3 y'.replace(regex, '').trim();

(?!\S) significa: no seguido de un carácter que no sea un espacio en blanco (que tiene éxito si la posición es seguida por un espacio o el final de la cadena) .


Otra forma: puede hacer coincidir todos los x e y consecutivos.

function strip(match, before, after) {
    return before && after ? ' ' : ''
}

var regex = /(^|\s)(?:y|x)(?:\s(?:y|x))*(\s|$)/g;

var str = 'x y 2 x 3 y'.replace(regex, strip);

Dividiendo la cadena:

var str = 'x y 2 x 3 y'.split(/\s+/).filter(a => !['x', 'y'].includes(a)).join(' ');
2
Casimir et Hippolyte 28 feb. 2018 a las 11:44

Lo resolví de otra manera que no usa trim ():

('x 1 y 2 x 3 y 4 x').replace(/(^|\s?)(?:y|x)(\s?|$)/g, strip)

function strip(match, before, after) {
  return before && after ? ' ' : ''
}

console.log("With 1: ", ('x 1 y 2 x 3 y 4 x').replace(/(^|\s?)(?:y|x)(\s?|$)/g, strip))

console.log("With 1: ", ('x y 2 x 3 y 4 x').replace(/(^|\s?)(?:y|x)(\s?|$)/g, strip))
-1
vityavv 28 feb. 2018 a las 02:13

Lo he hecho con 3 declaraciones de reemplazo:

('x y 2 x 3 y 4 x').replace(/\b[xy]\b/g, "").replace(/\b\s\s+\b/g, ' ').replace(/^\s+|\s+$/g, "")

EDITAR: el último se puede reemplazar con .trim()

0
vityavv 28 feb. 2018 a las 02:24