Tengo una sintaxis particular que uso en cadenas que me ayuda a recuperar e insertar subcadenas. un ejemplo:
{{ variable ||| <div>example text</div>}}Ahora me encuentro teniendo algo como:
{{ variable1 ||| <div>some text</div> <ul> {{ variable2 |||<li>some other text<li/>}} {{ variable3 |||<li>even more text<li/>}} </ul> }}y obviamente la expresión regular que uso para el primer caso no coincide correctamente.
la expresión regular que suelo usar es:
/\B\{\{(.*?)\|\|\|(.*?)\}\}/que en el segundo ejemplo coincide con:
{{ variable1 ||| <div>some text</div> <ul> {{ variable2 |||<li>some other text<li/>}}que no es lo que quiero.
Necesito una expresión regular para que coincida con esa sintaxis en particular cuando no contiene esa sintaxis en particular. He probado muchas combinaciones similares a esta:
\B\{\{(.*?)\|\|\|(.*(?!\{\{.*?\|\|\|.*?\}\}).*)\}\}pero no puedo resolverlo. Sería suficiente para obtener sólo
{{ variable2 |||<li>some other text<li/>}}Porque después de la coincidencia puedo eliminar esa sintaxis para que al verificar recursivamente pueda hacer coincidir todo.
La dificultad que tengo es que la cadena que analizo está solo en una línea, por lo que no puedo usar nada como
^(?!example).*$¿Tengo razón? ¿Qué me estoy perdiendo? No pude encontrar una solución en otras preguntas, así que escribí esto; lo siento si esto es un duplicado.
Muchísimas gracias
El problema que tiene aquí es que está comenzando a superar lo que puede lograr de manera útil * con una expresión regular: tal como van las cosas ahora, parece que tarde o temprano llegará a algo como:
{{ variable1 ||| <div>some text</div> <ul> {{ variable2 |||<li>some other text<li/>}} {{ variable3 |||<li>even more text <ul> <li>text always here</li> {{ variable4 ||| <li>optional text</li>}} </ul> <li/>}} </ul> }}En este tipo de situación, ha pasado el punto en el que tiene una sustitución de texto conveniente y está creando su propio lenguaje de marcado y sistema de plantillas. Una vez que sepa que es lo que está haciendo, no es demasiado difícil, pero definitivamente es una tarea más pesada: querrá analizar su texto en un árbol (regexes puede ser muy útil para esto) y luego usar sus variables para decidir qué nodos mostrar.
Lo que debe pensar si llega a este punto es si es mejor usar su propio marcado para esto, o si existe una herramienta que ya puede manejar lo que necesita con cambios mínimos en sus documentos existentes. Hay varios motores de plantillas disponibles en JavaScript (creo que Moustache y Handlebars son los más conocidos, pero vale la pena echarle un vistazo a herramientas como JSRender ) y es muy posible que algo ya se ajuste a sus necesidades.
* Cuando digo útil , lo que quiero decir es que más allá de cierto punto, si puede resolver un problema con Regex, tiende a volverse engorroso y difícil de mantener. Las expresiones regulares son excelentes herramientas para operaciones de texto simples, pero si se vuelven demasiado grandes o complicadas, puede ser muy difícil solucionarlas.