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 relevante. Mi problema son los casos en los que hay un carácter antes y después de la palabra que debe reemplazarse, a menos que el carácter sea un espacio en blanco o un guión.
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'
salida actual: 'word -description word2 adescriptiogn word3 -astatucs'
salida deseada: 'word -description word2 description word3 -status'
Mi enfoque podría ser el incorrecto, ya que empiezo a dudar de que se pueda hacer a través de expresiones regulares, pero tal vez alguien aquí tenga una idea para mí.
Editar: agregó más variedad en el objeto. El objeto es un ejemplo, pero el que uso para mi proyecto contiene más de 2k propiedades: pares de valores con valores que no siempre coinciden
Podría crear una expresión regular para capturar cualquiera de las palabras clave, utilizando un grupo de captura para identificar cuál era y una función de devolución de llamada para realizar la búsqueda de la traducción:
const translation = { descriptiogn:'description', decscription:'description', vdescription:'description', wdescription:'description', descriptiog:'description', statucs:'status', statuqs:'status', cstatus:'status', }; const regex = new RegExp("\\b\\w*(" + Object.keys(translation) .sort((a, b) => b.length - a.length) .join("|") + ")\\w*\\b", "g"); const fixTypos = str => str.replace(regex, (_, match) => translation[match]); const teststring= 'word -decscription word2 adescriptiogn word3 -astatucs' console.log(fixTypos(teststring));Puede ser necesario ordenar las palabras clave de la más larga a la más corta para dar prioridad a las coincidencias más largas cuando también coincidiría una clave más corta.
Simplemente usaría una alternancia aquí. Cree una matriz de términos de variantes de descripción para buscar y luego realice un reemplazo global.
var input = 'word -decscription word2 adescriptiogn word3 -adescriptiogn'; var terms = ['descriptiogn', 'decscription', 'vdescription', 'wdescription', 'descriptiog']; var regex = new RegExp("\\b\\w*(?:" + terms.join("|") + ")\w*\\b", "g"); var output = input.replace(regex, "description"); console.log(input); console.log(output);