2010-04-24 6 views
8

Qualcosa di simile a questo:
http://perl.plover.com/yak/regex/samples/slide083.htmlemacs: è possibile abbinare stringhe con parenti bilanciati con emacs regex?

In altre parole voglio abbinare con successo su { { foo } { bar} } ma non su { { foo }.

Vedo che è possibile in perl, and in .NET. E 'possibile in emacs regex?

+1

ha! COSÌ è divertente. Mentre cerco ulteriori suggerimenti su questo, digitando "emacs regex balanced" in google, ottengo * questa domanda * come prima hit. heh heh. – Cheeso

risposta

7

No, finora Perl/PCRE e .NET sono le uniche espressioni di espressioni regolari che supportano il nesting arbitrario (pattern ricorsivi).

+0

Mmkay, si ottiene un upvote anche se questa non è la risposta che volevo. – Cheeso

+0

Sì, mi dispiace. Ma non sono affatto sicuro che le regex ricorsive siano una buona cosa. Possono diventare abbastanza complicati senza di ciò già. Un parser combinato con una regex mi sembra più sensato. –

+1

Meh! le "espressioni regolari" che sono state estese al punto che possono farlo non sono più "regolari". Non che questa sia una cosa negativa, necessariamente, ma l'evoluzione dello strumento ha reso la terminologia obsoleta. – dmckee

2

No, ma se si dispone di un caso d'uso particolare per discutere, spesso si scopre che non è necessario regex. Le semplici macchine di stato per abbinare i parenthas sono abbastanza semplici da scrivere in lisp. Guardare la fonte di Paredit è un buon punto di partenza.

+0

sì, bene nel mio caso l'analisi paren è già fatta. È in cc-mode, quindi posso usare '(forward-sexp)' con la corrispondenza delle espressioni regolari su entrambi i lati. Speravo solo di essere in grado di farlo con una singola regex. – Cheeso

1

Se sei ancora interessato dai un'occhiata a cexp.el.

È solo un trucco ma forse è utile per il tuo scopo.

È possibile cercare espressioni combinate regolari e bilanciate con cexp-search-forward. Il re-search-forward integrato viene utilizzato per le espressioni regolari e quindi si applicano le sue regole di sintassi. Le espressioni bilanciate possono essere abbinate agli elementi di sintassi aggiuntivi \!( e \!).

La restrizione più grave è che le espressioni bilanciate potrebbero non verificarsi nei gruppi. Quindi un costrutto come \!(^{ \(\!(^{.*}$\!)\)+ }$\!) non funziona a causa del gruppo che contiene l'espressione bilanciata interna.

Tuttavia, un esempio utile è la corrispondenza TeX-definizioni come

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

con le espressioni combinate come

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

La ricerca tramite cexp-search-forward con la cexp precedente restituisce i limiti per il seguenti gruppi:

  1. L'inizio e la fine della partita intera
  2. I limiti della partita per l'espressione regolare prima dell'espressione bilanciato, cioè \def\mdo#1
  3. I limiti del gruppo acquisito nella prima espressione regolare, cioè #1
  4. I limiti dell'espressione bilanciato, cioè {{\def\next{\relax}\def\tmp{#1}\ifx\next\tmp\else\def\next{#1\mdo}\expandafter}\next}
+0

Considera l'espansione della risposta con un estratto dalla pagina di riferimento. Vedi [Come rispondere] (http://stackoverflow.com/questions/how-to-answer) per i dettagli sul perché i link nudi non sono considerati buone risposte. – bytebuster