RegEx-Zeichenfolgenformatierung in Notepad ++


7

Ich bin ziemlich gut in RegEx, aber eines kann ich anscheinend nicht herausfinden, wie es funktioniert.

Wie würde man in NotePad ++ suchen / ersetzen und sicherstellen, dass die Ausgabe eine feste Länge hat, während die Eingabe flexibel sein kann?

Beispiel: Führen Sie einen regulären Ausdruck für Folgendes aus: um 23-6-2016zu werden: 23-06-2016(zusätzliche 0 für 06, aber nicht, wenn es zum Beispiel 12 ist)

Eine andere Möglichkeit besteht darin, Folgendes zu erstellen:

TestStringund Testwürde
TestString______________________(zusätzliche Leerzeichen)
Test____________________________(zusätzliche Leerzeichen) werden.

Die Idee hier ist natürlich, eine Massensuche / -ersetzung durchzuführen, bei der die Ausgabe alle die gleiche Länge hat.

Bitte erläutern Sie den Gedanken dahinter.

BEARBEITEN: Um eine Vorstellung von den Daten zu geben, mit denen ich arbeite, ist hier eine Beispielzeile, die ich verarbeiten muss:

12345678    TXT 19700101    0   100 20160624    100 Comment text
12345678    TXT 19700101    100 100,25  20160624    0,25    Comment text
12345678    TXT 19700101    100,25  100,5   20160624    0,25    Comment text

Beachten Sie, dass diese durch Tabulatoren getrennt sind. Die erste 0 in der ersten Zeile sollte als 0,00, die 100 als 100,00 formatiert sein, aber die 12345678 und die Daten sollten nicht mit 00 formatiert werden. Die letzten 100,5 sollten als 100,50 formatiert sein

Ich habe mich um das Date-Zeug gekümmert, das ist momentan weniger wichtig.


Im Allgemeinen unmöglich, aber diese Arbeit für das erste Beispiel ohne zweistelliges Jahr: ersetzen \b(\d)\bdurch 0\1. Grund dafür ist, dass RegEx keine Möglichkeit bietet, die übereinstimmende Länge zu überprüfen.
Gast-vm

würde es vielleicht in 2 Suchen funktionieren? Alle zusätzlichen Leerzeichen in der ersten Suche hinzufügen und in der zweiten wieder entfernen?
LPChip

Ah ja. Ich beschränkte mich auf die Einzelsuche.
Gast-vm

Was versuchst du hier zu erreichen? Mit anderen Worten, warum muss diese Datei formatiert werden: eine besser lesbare Textdatei (durch Ausrichten von Spalten), Lesen von Feldern in eine andere Anwendung (mit bestimmten Spaltenstartpositionen), Verständnis für reguläre Ausdrücke?
Steven

Ich muss 2 verschiedene formatierte CSV-Dateien zu einer zusammenführen, bevor ich sie importieren kann. Durch das gleiche Format kann ich dann die Duplikate identifizieren. Abgesehen davon versuche ich auch zu lernen, wie man das mit RegEx macht, damit ich möglicherweise solche Dinge in PHP-Projekten implementieren kann, an denen ich arbeite (aber nicht an diesem)
LPChip

Antworten:


5

Als Antwort auf:

12345678 TXT 19700101 0 100 20160624 100 Kommentartext
12345678 TXT 19700101 100 100,25 20160624 0,25 Kommentartext
12345678 TXT 19700101 100,25 100,5 20160624 0,25 Kommentartext

Für 4. Spalte:
^((?:\S+\s+){3}\d+)(\s)bis \1,0\2
^((?:\S+\s+){3}\d+,\d)(\s)zu\10\2

Für 5. / 7. Spalte:
ähnlich oben, ersetzen Sie einfach {3}mit {4}/ {6}in der Regel jeweils

Erläuterung
1. Regel

Die 1. Regel hängt ,0an Zahlen ohne an ,. Jetzt müssen alle Zahlen haben ,\d.

2. Regel

Die 2. Regel hängt ein 0an diejenigen mit einer einstelligen Stelle nach dem Komma an.

Für (?:): Nicht-Erfassungsgruppe werden die vorherigen Spalten bereits erfasst, \1sodass keine zusätzliche Erfassung erforderlich ist.

Dies füllt nur die Nummer mit 2 Dezimalstellen auf. Verwenden Sie den pad excessively, then trimAnsatz , um einen beliebigen Betrag aufzufüllen.

Letztes Wort?
Meiner Meinung nach ist normaler Regex wie in Notepad ++ für diese Aufgabe nicht geeignet. Einige grundlegende Skripte wie Bash oder Perl hätten dies mit viel höherer Lesbarkeit erledigt.


Würde es Ihnen etwas ausmachen, den regulären Ausdruck zu erklären?
LPChip

Es ist immer noch ein bisschen rätselhaft, aber ich fange an, es zu verstehen. Das Verknüpfen dieser Regeln und der Nicht-Erfassungsgruppe ist nützlich, obwohl dies für SuperUser häufig verpönt ist, da diese Antwort etwas nutzlos wird, wenn eine dieser Websites offline geschaltet wird. Jetzt könnte die Verbindung zum Stapelaustausch bestehen bleiben, die anderen beiden sollten meiner Meinung nach Bilder sein. Wenn Sie das ändern, akzeptiere ich diese Antwort, da sie es besser macht als die andere Antwort. In jedem Fall erhalten Sie eine Abstimmung.
LPChip

@LPChip fertig. Übrigens, sollten die Quelllinks ausfallen, gibt es andere Regex-Visualisierer, also keine Sorge.
Gast-VM

5

Abschnitt A: Pad auf bestimmte Länge

Um Zeilen mit N Zeichen mit regulären Ausdrücken nach rechts zu füllen, fügen Sie am Ende der Zeile N Leerzeichen hinzu und gruppieren Sie dann die ersten N Zeichen, die den Rest ersetzen.

Pass 1: Füge Füllzeichen hinzu

Suchen: $Ersetzen:______________________________

Fügen Sie am Ende der Zeile 30 Leerzeichen hinzu. (Ich habe Unterstriche verwendet, da Leerzeichen im Beitrag nicht formatiert werden).

Pass 2: 30 Zeichen links abschneiden

Passen Sie jeden Abschnitt entsprechend an, um ein durch Striche getrenntes Datum am Zeilenanfang aufzufüllen.

Suchen: ^([[:print:]]{0,30}).*$ Ersetzen durch\1

Ersetzen Sie am Anfang der Zeile eine Gruppe mit bis zu dreißig druckbaren Zeichen, gefolgt von verbleibenden Zeichen durch die Gruppe.

Um eine andere Zeilenlänge auszuwählen, verwenden Sie in Durchgang 1 n-Leerzeichen und ersetzen Sie 30 durch die Länge in Durchgang 2.

Abschnitt B: Zeile ab Datum

Pass 1 (Tag des Monats):

Finden Sie was: ^([0-9])- Ersetzen durch:0\1-

Ersetzen Sie das Muster (Linie beginnend mit einer einzelnen Ziffer, gefolgt von einem Bindestrich) durch die aufgefüllte Null, die Ziffer und den Bindestrich.

Pass 2 (Monat) :

Finden Sie was: -([0-9])- Ersetzen durch:-0\1-

Ersetzen Sie das Muster (eine einzelne Ziffer zwischen zwei Strichen) durch einen Bindestrich, die aufgefüllte Null, die Ziffer und den Bindestrich.


1
Würde es Ihnen etwas ausmachen, Ihren Beitrag zu bearbeiten und den regulären Ausdruck selbst zu erklären? Der Grund, warum ich danach frage, ist, wenn ich eine CSV-Datei in ein anderes Format konvertieren muss, damit die Daten importiert werden können. Es ist nicht immer dasselbe, also ist das Ersetzen von Notepad ++ Regex wirklich der richtige Weg. Außerdem ist es auch gut zu verstehen, wie es funktioniert.
LPChip

Ich kenne Regex sehr gut. Ich hatte tatsächlich gehofft, eine Beschreibung in der Art von: finde nur 1 Zahl und wenn ja, füge eine führende 0 davor hinzu. Dadurch wird jede Zahl mit 2 übersprungen. Dies bedeutet natürlich, dass dies nur funktioniert, wenn das Datum am Anfang der Zeile beginnt, und nicht, wenn sich das Datum an einer anderen Stelle befindet. Ich vermisse immer noch, wie man mit dem TestString arbeiten würde, um ihn durch eine feste Länge zu ersetzen. Und Ihre anderen Gedanken helfen in diesem Fall nicht. Wenn Sie (oder jemand anderes) eine richtige Antwort schreiben können, die den TestString enthält, werde ich sie akzeptieren.
LPChip

Ich habe die Antwort bearbeitet. Abschnitt A schneidet oder erweitert jede Zeile auf eine bestimmte Anzahl von Zeichen. Abschnitt B erweitert die Zeile a beginnend mit einem Datum.
Steven

Danke für die Bearbeitung. Wie würde ich vorgehen, wenn dieser Text Elemente vor und nach enthält, die beispielsweise durch ein \ t-Zeichen getrennt sind? Also will ich machen other stuff \tMyString\t more stuffzu sein other stuff \tMyString_____________\t more stuff? Das ist das Szenario, in dem ich mich im Grunde befinde.
LPChip

Ich brauche immer noch Hilfe dabei. Ihre Beispiele berücksichtigen, dass die Daten am Anfang der Zeile beginnen und am Ende enden. Dies ist bei mir nicht der Fall, was bedeutet, dass keiner der regulären Ausdrücke funktioniert. Sie sind Teil einer CSV, die andere Daten enthält, und ich muss die anderen Daten sorgfältig überspringen. Dies macht, dass es nicht funktioniert ... :(
LPChip
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.