2009-08-20 25 views
24

Wie machen Sie eine Abfrage ersetzen-Regexp in Emacs, die über mehrere Zeilen übereinstimmen?Emacs query-replace-regexp multiline

als triviales Beispiel würde ich möchte <p>\(.*?\)</p>

<p>foo 
bar 
</p> 
+1

Ich nehme an, Sie sahen Emacswiki: http://www.emacswiki.org/emacs/MultilineRegexp – seth

+1

Ja, ich sah das, aber konnte es nicht funktionieren mit Query-Replace-regexp. immer noch versuchen, obwohl re-builder verwenden, um es zu testen ... hoffentlich werde ich es bald herausfinden –

+1

Das Beispiel ist sehr schlecht, weil das Parsen von HTML mit regulären Ausdrücken ist im Allgemeinen keine gute Idee. – Svante

Antwort

20

Versuchen Sie Zeichenklassen. Solange Sie nur ASCII-Zeichensatz verwenden, können Sie statt des Punktes [[:ascii:]] verwenden. Die Verwendung des längeren [[:ascii:][:nonascii:]] sollte für alles funktionieren.

+0

ehrfürchtig danke dude –

+1

Und wenn Sie nicht nur ASCII verwenden? – Jackson

+0

[[: ascii:] [: nonascii:]] * gibt mir einen Stacküberlauf – helcim

22
M-x re-builder 

ist dein Freund entsprechen. Und es führte mich zu diesem regulären Ausdruck:

"<p>\\(.\\|\n\\)*</p>" 

, die die String-Version von

<p>\(.\|^J\)*</p>   ;# where you enter ^J by C-q C-j 

Und das funktioniert für mich, wenn ich re-search-forward, aber nicht, wenn ich 'query-replace-regexp. Unsicher, warum ...

Wenn nun ein 're-search-forward (aka C-u C-s) tun, können Sie M-% geben, die Sie für einen Ersatz aufgefordert wird (wie von Emacs 22). So können Sie Ihre Suche durchführen und durch die obige Regexp ersetzen.

Hinweis, wird die oben regexp, bis die in dem Puffer gefunden letzten</p> übereinstimmen, das ist wahrscheinlich nicht das, was Sie wollen, so benutzen re-Builder ein regexp zu bauen, die näher kommt, was Sie wollen. Offensichtlich können reguläre Ausdrücke keine Klammern zählen, Sie sind also selbständig - abhängig davon, wie robust eine Lösung ist.

+0

Gibt es Info-Dateien für den Re-Builder? Ich bin neugierig, wie man es benutzt. – seth

+1

Nicht das ich finden kann. Auch das Emacs-Wiki hat nicht viel zu bieten. Aber es ist ziemlich selbsterklärend (ist nicht alles von Emacs :). Nachdem Sie 're-builder' eingegeben haben, geben Sie' C-c C-h' ein und Sie erhalten eine Auflistung von Bindings, einschließlich jener, die für 're-builder' gelten, die alle mit' C-c' beginnen. –

+0

Yah, ich bin so weit gekommen. War nur auf der Suche nach etwas mehr in der Tiefe. Vielen Dank! – seth