es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eres un traductor de español que traduce documentos de TI. Traduce lo siguiente al español: reemplazar palabra con coincidencia del objeto en JS.

Estoy tratando de reemplazar palabras en una cadena con coincidencias de un objeto.
Si una palabra coincide con la propiedad de un objeto, será reemplazada por el valor correspondiente.
Mi problema está en los casos en los que hay un caracter antes y después de la palabra que debería ser reemplazada, a menos que el caracter sea un espacio en blanco o un guion.

function fixTypos(str) {
  var typoObject = {
    descriptiogn:'description',
    decscription:'description',
    vdescription:'description',
    wdescription:'description',
    descriptiog:'description',
    statucs:'status',
    statuqs:'status',
    cstatus:'status',
  };

  for (var key in typoObject) {
    str = str.replace(new RegExp('\\b' + key + '\\b', "gi"), typoObject[key]);
  }
  return str;
}

teststring: 'word -decscription word2 adescriptiogn word3 -astatucs'

output actual: 'word -description word2 adescriptiogn word3 -astatucs'

output deseado: 'word -description word2 description word3 -status'

Mi enfoque podría estar mal, ya que comienzo a dudar si se puede hacer a través de una expresión regular (regex), pero tal vez alguien aquí tenga una idea para mí.

Edit: se agregó más variedad en el objeto. El objeto es un ejemplo, pero el que uso para mi proyecto contiene más de 2k pares propiedad:valor con valores que no siempre coinciden.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para manejar los casos en los que hay un carácter antes y después de la palabra que debe ser reemplazada, puedes modificar la expresión regular utilizada en la función str.replace. Un enfoque para lograr el resultado deseado es utilizar una búsqueda negativa hacia adelante y una búsqueda negativa hacia atrás en la expresión regular para asegurarse de que el carácter antes y después de la palabra no sea un guión o un espacio en blanco. La función modificada se vería así:

    function fixTypos(str) {
      var typoObject = {
       descriptiogn:'description',
       decscription:'description',
       vdescription:'description',
       wdescription:'description',
       descriptiog:'description',
       statucs:'status',
       statuqs:'status',
       cstatus:'status',
      };
      for (var key in typoObject) {
        str = str.replace(new RegExp(`(?<![\\w-])${key}(?![\\w-])`, "gi"), typoObject[key]);
       }
      return str; 
    } 
    

    Explicación de la expresión regular modificada:

    • (?<![\\w-]) – Búsqueda negativa hacia atrás para asegurarse de que el carácter antes de la palabra no sea un carácter de palabra o un guión.
    • ${key} – La palabra/clave que se va a reemplazar.
    • (?![\\w-]) – Búsqueda negativa hacia adelante para asegurarse de que el carácter después de la palabra no sea un carácter de palabra o un guión.

    Esta expresión regular modificada debería reemplazar solo las palabras que coincidan con la clave en el objeto, y no ninguna otra parte de la cadena.

Comments are closed.