En JavaScript, estoy usando el siguiente código para reemplazar el texto que coincide con una determinada cadena. El reemplazo envuelve la cadena así: "A(hello)" . Funciona muy bien, pero si hay dos cadenas que son iguales, por ejemplo: "Hello hi Hello" , solo se marcará la primera y, si intento dos veces, se marcará doble, así: "A(A(Hello)) Hi Hello" .
Una solución a esto podría ser no reemplazar una palabra si contiene "A(" o está entre "A(" y ")" ; ambos funcionarían.
¿Alguna idea de cómo se puede lograr?
Nota: no puedo usar replaceAll porque si ya hay una palabra que se reemplaza y se agrega una nueva, se sobrescribirá la primera. Por lo tanto, necesito una solución como la anterior. Por ejemplo, si tengo una cadena que dice "Hola hola" y marco Hola, dirá "A (Hola) hola", pero si luego agrego Hola nuevamente al texto y lo reemplazo, se verá así: A(A(Hello)) hi A(Hello) .
Esto es lo que tengo hasta ahora:
let text = "Hello hi Hello!" let selection = "Hello" let A = `A(${selection})` let addWoman = text.replace(selection, A)Puede usar una aserción de anticipación negativa en su patrón que falla la coincidencia si A( antes de la palabra completa Hello :
(?<!A\()\bHello\b Y reemplácelo con A($&)
Código:
let text = "Hello hi Hello!"; let selection = "Hello"; let A = `A(${selection})`; let re = new RegExp(`(?<!A\\()\\b${selection}\\b`, "g"); let addWoman = text.replace(re, A); console.log(addWoman); console.log(addWoman.replace(re, A));Una solución a esto podría ser no reemplazar una palabra si contiene "A(" o está entre "A(" y ")"; ambos funcionarían.
Para evitar volver a hacer coincidir la selection dentro de una cadena A(...) , puede hacer coincidir A(...) y capturarlo en un grupo para saber si el grupo coincidió, debe conservarse, de lo contrario, haga coincidir la palabra de tu preferencia:
let text = "Hello hi Hello!" let selection = "Hello" let A = `A(${selection})` const rx = new RegExp(String.raw`(A\([^()]*\))|${selection.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')}`, 'g') let addWoman = text.replace(rx, (x,y) => y || A) console.log(addWoman); // Replacing the second time does not modify the string: console.log(addWoman.replace(rx, (x,y) => y || A)) La expresión regular se verá como /(A\([^()]*\))|Hello/g , coincide
(A\([^()]*\)) - Grupo 1: A y luego ( seguido de cero o más caracteres que no sean ( y ) y luego a ) char| - oHello - una cadena Hello .