Suchen von in der Länge variabler Zeichenketten + Ersetzen (Textdatei)

Schiller72

Lieutenant
Registriert
Dez. 2013
Beiträge
604
Hallo,

kann mir jemand bei Folgendem Problem helfen? In einer Textdatei soll eine Zeichenfolge, die mit der Phrase START als Kennung beginnt und mit der Phrase ENDE endet durch eine neue Zeichenfolge ersetzt werden (NEUEZEICHENFOLGE). Der Text zwischen START und ENDE ist wechselnd und weist erschwerend eine variabel Länge (also eine unterscheidliche Zahl an Zeichen zwischen START und ENDE auf).

Suchen nach: STARTabcdefg....Länge_und_Inhalt_Variabel_abcdeENDE

Ersetzen: NEUEZEICHENFOLGE

Gibt es für diese Aufgabe möglicherweise Tools oder Batch-Dateien, welche dies bewerkstelligen können?

Vielen Dank für Antworten.

Schiller72
 
Dafür gibt es reguläre Ausdrücke. Die kann man z.B. bei PSPAD oser NOTEPAD++ verwenden
 
/(START)(.*)(ENDE)/g

Group1:START
Group2:"alles dazwischen"
Group3:ENDE
 
Das klingt schon einmal gut. Der NotePad++ habe ich auf meinem Rechner. Nun weiß ich leider nicht, wie ich bei diesen die regulären Ausdrücke parametriere ...

Dieser Schnellversuch klappte schon mal nicht :(
NotePadP2.jpg
 

Anhänge

  • NotePadP.jpg
    NotePadP.jpg
    35,9 KB · Aufrufe: 430
mein Regex, nur ohne die / /g
bei Replace dann: "\1"HIER WAS GETAUSCHT WERDEN SOLL"\3" ohne die " jeweils.

\1 und \3 sind die Capturing Groups die erhalten bleiben sollen.
 
Zuletzt bearbeitet:
Vielen Dank ! :)
Der erste Erfolg hat sich nun eingestellt. Jedoch ist irgendwie noch ein Fehler im Ausdruck. Nach dem Ersetzen fehlt das erste "E" von der Capturing Group ENDE.

NotePadP3.jpg

NotePadP4.jpg

Ein weiteres neues Problem: Wie kann ich es bewerkstelligen, dass wenn die Capturing Groups mehrfach auftreten, nicht vom ersten START bis zum letzten ENDE ersetzt wird sondern 2 mal jeweils von START bis ENDE. ?
z.B.: START...abcde....ENDE...xyz....START..uvw123...ENDE
 
Zuletzt bearbeitet:
Vielen vielen DANK e_LAP, damit klappt es einwandfrei. :):)

NotePadP6.jpg

Hast Du evt. auch noch eine Idee, wie ich das Verschachtelungsproblem dabei lösen kann. Mein Ziel ist, dass einzeln ersetzt wird, nicht zwischen den äußersten beiden "Beginn" "Ende" Schlüsselwörtern, wenn sich darin untergeordnete "Beginn" und "Ende" befinden
NotePadP7.jpg
NotePadP8.jpg
 
Was soll bei den neuen Fotos jetzt ersetzt werden? Habe deine Anforderung nicht ganz verstanden.
 
Bsp.:
fa34<table><body>rsta</body></table>abcdffff<table><body>yzt</body></table>rewsd

Der Text zwischen <table><body> und </body></table> soll ersetzt werden z.B. durch ZZZ.

Mit der bisherigen Form des regulären Ausdruckes für Suchen und Ersetzen entsteht:
fa34<table><body>ZZZ</body></table>rewsd

Ziel ist es aber folgende Form:
fa34<table><body>ZZZ</body></table>abcdffff<table><body>ZZZ</body></table>rewsd
 
bei search:
Code:
(.*)(<table><body>)(.*)(<\/body><\/table>)(.*)(<table><body>)(.*)(<\/body><\/table>)(.*)

bei replace:

Code:
\1\2text\4\5\6text\8\9


statt 'text' deinen neuen Inhalt

\nummer entspricht jeweils einer gekappselten Einheit also (xxx)
.* -> beliebiges Zeichen, beliebig oft.
Bei Replace gibst du einfach an, welche gekappselten Gruppen so bleiben sollen. Und alles andere schreibst du als Klartext direkt rein.

\/ entspricht einem escapten /. Wird gebraucht da / ein reserviertes Symbol ist.

http://www.regexr.com/ - Ist sehr hilfreich um reguläre Ausdrücke zu entwickeln und testen.
 
Zuletzt bearbeitet:
Und wenn die Anzahl der zu suchenden Elemente unbekannt ist. Kann man dem Suchalgorithmus irgendwie "beibringen" immer nur den Teil zwischen 2 benachbarten Einheiten (öffnende und schließende) zu ersetzen ?
 
Puh, ich bin auch eher reguläre Ausdrücke Anfänger. Das hört sich dann nach nem deutlich komplexeren Ausdruck an.

was wäre mit:
Code:
(<.*>)(<.*>)(.*)(<\/.*>)(<\/.*>)

und

Code:
\1\2text\4\5

Wenn jeweils nur einmal pro Zeile auf und wieder zu geht, klappts bei mir.
 
Zuletzt bearbeitet:
Okay die erste Lösung (#12) klappt prima, bei der zweiten (#14) bin ich noch am Probieren. Aber evt. kann ich bei meinem Problem auch die Zeichenketten in den Dateien so abschätzen, dass Lösung (#12) ausreicht.

Vielen vielen Dank für deine Hilfe !! :):)

Ich habe Notepad++ schon länger hier ab und zu in Benutzung zum Coden, dass er über eine solch leistungsfähige Suchfunktion mit regulären Ausdrücken verfügt, war mir aber so noch gar nicht bewusst.
 
Zuletzt bearbeitet:
Übrigens kannst du auch in Word mit der Mustersuche so was wie reguläre Ausdrücke verwenden...
 
Zurück
Oben