2010-04-24 10 views
8

Algo como esto:
http://perl.plover.com/yak/regex/samples/slide083.htmlemacs: ¿Es posible hacer coincidir cadenas con parens balanceados con emacs regex?

En otras palabras que quiero que coincida con éxito en { { foo } { bar} } pero no en { { foo }.

Veo que es posible en Perl, and in .NET. ¿Es posible en emacs regex?

+1

ha! SO es divertido. Mientras busco más pistas sobre esto, escribiendo "emacs regex balanceado" en google, obtengo * esta pregunta * como el primer golpe. je je. – Cheeso

Respuesta

7

No, hasta ahora, Perl/PCRE y .NET son los únicos sabores regex que admiten anidamiento arbitrario (patrones recursivos).

+0

Mmkay, obtienes un voto favorable a pesar de que esta no es la respuesta que yo quería. – Cheeso

+0

Sí, lo siento. Pero no estoy seguro de si las expresiones regulares recursivas son una buena cosa. Pueden complicarse bastante sin eso ya. Un analizador combinado con una expresión regular me parece más sensato. –

+1

Meh! Las "expresiones regulares" que se han extendido hasta el punto en que pueden hacer esto ya no son "regulares". No es que esto sea algo malo, necesariamente, pero la evolución de la herramienta ha hecho que la terminología sea obsoleta. – dmckee

2

No, pero si tiene un caso de uso particular para discutir, a menudo encontrará que no necesita expresiones regulares. Las máquinas de estados simples para unir las fases de los padres son bastante simples de escribir en lisp. Ver el origen de Paredit es un buen lugar para comenzar.

+0

sí, bueno en mi caso, el análisis sintáctico ya está hecho. Está dentro del modo cc, así que puedo usar '(forward-sexp)' con correspondencia de expresiones regulares en cada lado. Solo esperaba poder hacerlo con una sola expresión regular. – Cheeso

1

Si aún está interesado, eche un vistazo a cexp.el.

Es solo un truco pero quizás sirva para su propósito.

Puede buscar expresiones regulares y equilibradas combinadas con cexp-search-forward. El re-search-forward incorporado se usa para expresiones regulares y, por lo tanto, se aplican sus reglas de sintaxis. Las expresiones equilibradas se pueden combinar con los elementos de sintaxis adicionales \!( y \!).

La restricción más seria es que las expresiones equilibradas pueden no producirse en grupos. Entonces una construcción como \!(^{ \(\!(^{.*}$\!)\)+ }$\!) no funciona debido al grupo que contiene la expresión interna balanceada.

Sin embargo, un ejemplo útil es coincidente tex-definiciones como

\def\mdo#1{{\def\next{\relax}\def\tmp{#1}\ifx\next\tmp\else\def\next{#1\mdo}\expandafter}\next} 

con expresiones combinadas como

\\def\\[[:alpha:]]+\(#[0-9]\)*\!(^{.*}$\!) 

La búsqueda a través de Cexp-search-forward con el Cexp anterior devuelve los límites para la siguientes grupos:

  1. El comienzo y el final del partido completo
  2. Los límites de la aparición de la expresión regular antes de la expresión equilibrada, es decir, \def\mdo#1
  3. Los límites del grupo capturados en la primera expresión regular, es decir, #1
  4. Los límites de la expresión equilibrada, es decir, {{\def\next{\relax}\def\tmp{#1}\ifx\next\tmp\else\def\next{#1\mdo}\expandafter}\next}
+0

Considere expandir su respuesta con un extracto de la página referenciada. Consulte [Cómo responder] (http://stackoverflow.com/questions/how-to-answer) para obtener más información sobre por qué los enlaces desnudos no se consideran buenas respuestas. – bytebuster

Cuestiones relacionadas