2 Stimmen

Wie wähle ich den gesamten Code zwischen den Kommentaren mit Notepad++ aus (regex)?

Ich versuche, einen Codeblock zwischen 2 Kommentar-Tags wie folgt auszuwählen:

<!-- begin answers -->
   ...[code]
<!-- end answers -->

Ich habe etwas ausprobiert, das in etwa wie folgt aussieht <!-- begin answers -->.*<!-- end answers --> aber meine Regex-Kenntnisse sind ziemlich begrenzt. Meine Kenntnisse über das Suchen und Ersetzen in Notepad++ sind ebenfalls sehr begrenzt, aber der Grund, warum ich es verwende, ist die Option "Ersetzen in offenen Dateien", die ich für sehr nützlich halte. Der Grund dafür ist, dass ich in etwa 4000 Dateien suchen/ersetzen möchte.

Der Code zwischen diesen Kommentaren kann etwas variieren (Leerzeichen, Whitespace), so dass ich etwas Flexibles brauche, um damit umzugehen.

Danke!

3voto

YWE Punkte 2789

Der reguläre Ausdruck, den Sie versucht haben, sollte funktionieren, aber leider kann die Regex-Engine, die Notepad++ verwendet (Scintilla), nicht über neue Zeilen hinweg passen. Es gibt also keine Möglichkeit, dies zu tun. Diese Einschränkung ist dokumentiert aquí . Außerdem unterstützt es nur sehr einfache Ausdrücke. Und Sie können nicht nur den Text zwischen den Kommentaren auswählen (ohne auch die Kommentare auszuwählen), da Vorausschau- und Nachschau-Assertions nicht unterstützt werden.

1voto

Toto Punkte 85935

Sie können seit Notepad++ v~ 6.0+ verwenden:

was suchen: (?<=<!-- begin answers -->\r?\n).*?(?=<!-- end answers -->)

Dadurch wird der gesamte Code hervorgehoben, der sich zwischen <!-- begin answers -->\r?\n et <!-- end answers -->

Stellen Sie sicher, dass Sie Zecken haben Regular Expression et dot match newline

0voto

bhavinp Punkte 823

Sie können eine kleine Anwendung schreiben, um die Datei als lange Zeichenkette zu lesen. Dann bestimmen Sie den Index des ersten Kommentars mit etwas wie...

xml.IndexOfAny("<!-- begin answers -->".ToCharArray(), 0, xml.Count());
xml.IndexOfAny("<!-- end answers -->".ToCharArray(), 0, xml.Count());

Sobald Sie die Indizes kennen, können Sie mit SubString herausfinden, was dazwischen liegt. Sie müssen mit der Indizierung von Anfang und Ende herumspielen, um genau das zu finden, was dazwischen liegt. Der obige Code ist in C#, aber es gibt eine entsprechende API in Java.

0voto

mechanical_meat Punkte 154171

YWE hat genau die richtige Erklärung dafür, warum Ihre Regex nicht richtig funktioniert; +1 für ihn.

Der unten stehende Code zeigt, wie einfach so etwas in Python zu bewerkstelligen ist. Bitte beachten Sie, dass dies für eine Datei funktioniert, aber Sie können es leicht ändern, um ein Verzeichnis von Dateien zu suchen und zu ersetzen.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re

def main():
    FIN = 'fin.html'
    FOU = 'fou.html'
    with open(FIN, 'r') as fin, open(FOU, 'w') as fou:
        re_sub = re.compile('<!-- begin answers -->(.*)<!-- end answers -->', 
                            re.DOTALL) # DOTALL enables multiline patterns
        text_to_search_replace = infile.read()
        outfile.write(re_sub.sub('...[some new code]', text_to_search_replace))

if __name__ == "__main__":
    main()

DOTALL Dokumentation
Python regex HOWTO von A.M. Kuchling

0voto

Mit der untenstehenden Funktion Suchen & Ersetzen ( Regulärer Ausdruck et .passt zu Zeilenumbruch ausgewählt) funktioniert bei mir:

<!-- begin answers -->(.*?)<!-- end answers -->

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X