Necesito envolver cualquier expresión en una cadena (puede ser una cadena multilínea con muchas expresiones, mezclada con palabras regulares) que comience con abc.(efg|xyz).bar. con llaves.
Estoy usando el enfoque de buscar y reemplazar usando el siguiente Regex:
const MY_REGEX = /"?(?<![a-zA-Z0-9-_])((?:abc\.(efg|xyz\.bar))(?:\.[a-zA-Z0-9-_]*)+)"?/gm someInput.replace(MY_REGEX, '{{$1}}')Mi estrategia funciona bien para casos simples como este:
const input = 'abc.efg.bar.name.first, abc.xyz.role, non.captured.term' // outputs: {{abc.efg.bar.name.first}}, {{abc.xyz.role}}, non.captured.termPero falla miserablemente para entradas complejas como esta:
const input = 'abc.xyz.bar.$func(foos[param[name="primary" and bool=true]].param[name="new"].multiValue)' // outputs: {{abc.xyz.bar.}}$func(foos[param[name="primary" and bool=true]].param[name="new"].multiValue) // Should be: {{abc.xyz.bar.$func(foos[param[name="primary" and bool=true]].param[name="new"].multiValue)}}Estoy buscando una forma más robusta o una mejor expresión regular para hacerlo. ¿Alguna sugerencia?
Según los ejemplos que proporcionó , parece que debería ser el delimitador entre expresiones. Entonces (?:\.[a-zA-Z0-9-_]*)+) a [^,]* para hacer coincidir todo hasta el siguiente , .
const MY_REGEX = /"?(?<![a-zA-Z0-9-_])((?:abc\.(efg|xyz\.bar))[^,]*)"?/gm; console.log('abc.xyz.bar.$func(foos[param[name="primary" and bool=true]].param[name="new"].multiValue)'.replace(MY_REGEX, '{{$1}}')); console.log('abc.efg.bar.name.first, abc.xyz.role, non.captured.term'.replace(MY_REGEX, '{{$1}}'));