Soy consciente de que esto puede coincidir fácilmente con /(\[tag\]|{{tag}})/ pero eso no es lo que estoy buscando. Este es el comienzo de una expresión regular más larga que estoy tratando de escribir (análisis de atributos, etc.)
Mi criterio es:
Tengo la siguiente expresión regular funcionando, pero no me siento cómodo con la expresión regular que no funciona exactamente como la lees:
A los efectos de la legibilidad, voy a pretender que Javascript tiene el indicador "X" aquí. Sé que no.
(?:(\[)|{{) // Group with alternatives but only capturing group 1 so we can look around (tag) // Capture the part between the wrappers (?: // I don't care about capturing the closing wrapper, just match it (?=\1)}} // Closing condition A (works, but why?) | // OR (?!\1)] // Closing condition B (works, but why?) )Como puedes ver, funciona aquí:
let input = ` [tag][ <-- [tag[ [tag}} {{tag] {{tag}} <-- tag}} {{tag [tag tag] `; input = input.replace(/(?:(\[)|{{)(tag)((?=\1)}}|(?!\1)])/g, "@@@@@"); console.log(input); Si trato de analizar a ojo la expresión regular, ¿no debería ser que la condición de cierre A debe coincidir con ] cuando \k<s> es verdadero?
Sin embargo, si hago eso, termino haciendo coincidir las cosas incorrectas y solo funciona la configuración anterior.
¿Algún gurú de expresiones regulares quiere iluminarme?
Gracias voldomazta
La primera coincidencia usará la condición de cierre B porque el siguiente carácter es ] , que no es \1 .
La segunda coincidencia utilizará la condición de cierre A porque el grupo 1 no está undefined , lo que satisfará la previsión.
Dado que javascript regex no admite condicionales (como lo hace C #), elegiría el patrón que tiene en la primera línea. Sin embargo, para tener solo la parte de la tag una vez, escribiría la parte de la expresión regular de la tag en una variable, luego usaría el constructor que toma una cadena, ahora es fácil agregar la misma cadena dos veces y solo tiene una expresión regular para mantener.