emacs: Ist es möglich, Saiten mit ausgewogenen Parens mit Emacs Regex zu vergleichen?

8

So etwas wie:
Ссылка

Mit anderen Worten möchte ich erfolgreich auf { { foo } { bar} } , aber nicht auf { { foo } .

Ich sehe es in Perl, und in .NET . Ist es in Emacs Regex möglich?

    
Cheeso 24.04.2010, 14:09
quelle

3 Antworten

7

Nein, bis jetzt sind Perl / PCRE und .NET die einzigen Regex-Varianten, die beliebige Verschachtelung (rekursive Muster) unterstützen.

    
Tim Pietzcker 24.04.2010, 14:11
quelle
2

Nein, aber wenn Sie einen bestimmten Anwendungsfall diskutieren, werden Sie oft feststellen, dass Sie keine regulären Ausdrücke benötigen. Einfache State-Maschinen zur Anpassung von Parenthases lassen sich recht einfach in Lisp schreiben. Ein Blick auf die Quelle von Pa - redit ist ein guter Anfang.

    
Singletoned 24.04.2010 15:40
quelle
1

Wenn Sie noch interessiert sind, schauen Sie sich cexp.el an.

Es ist nur ein Hack, aber dient vielleicht Ihrem Zweck.

Sie können nach kombinierten regulären und ausgeglichenen Ausdrücken mit cexp-search-forward suchen. Das eingebaute re-search-forward wird für reguläre Ausdrücke verwendet und daher gelten die Syntaxregeln. Ausgeglichene Ausdrücke können mit den zusätzlichen Syntaxelementen \!( und \!) abgeglichen werden.

Die schwerwiegendste Einschränkung ist, dass ausgeglichene Ausdrücke nicht in Gruppen vorkommen dürfen. Ein Konstrukt wie \!(^{ \(\!(^{.*}$\!)\)+ }$\!) funktioniert nicht, weil die Gruppe den inneren ausgeglichenen Ausdruck enthält.

Dennoch ist ein nützliches Beispiel die Übereinstimmung von TeX-Definitionen wie

%Vor%

mit kombinierten Ausdrücken wie

%Vor%

Die Suche über cexp-search-forward mit dem obigen cexp gibt die Limits für die folgenden Gruppen zurück:

  1. Der Anfang und das Ende des vollständigen Spiels
  2. Die Grenzen der Übereinstimmung für den regulären Ausdruck vor dem ausgeglichenen Ausdruck, d. h. \def\mdo#1
  3. Die Grenzen der erfassten Gruppe im ersten regulären Ausdruck, d. h. #1
  4. Die Grenzen des ausgeglichenen Ausdrucks, d. h. {{\def\next{\relax}\def\tmp{#1}\ifx\next\tmp\else\def\next{#1\mdo}\expandafter}\next}
Tobias 07.02.2012 09:22
quelle

Tags und Links