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-2016
zu 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:
TestString
und Test
wü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.
\b(\d)\b
durch0\1
. Grund dafür ist, dass RegEx keine Möglichkeit bietet, die übereinstimmende Länge zu überprüfen.Antworten:
Als Antwort auf:
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 jeweilsErläuterung
Die 1. Regel hängt
,0
an Zahlen ohne an,
. Jetzt müssen alle Zahlen haben,\d
.Die 2. Regel hängt ein
0
an diejenigen mit einer einstelligen Stelle nach dem Komma an.Für
(?:)
: Nicht-Erfassungsgruppe werden die vorherigen Spalten bereits erfasst,\1
sodass keine zusätzliche Erfassung erforderlich ist.Dies füllt nur die Nummer mit 2 Dezimalstellen auf. Verwenden Sie den
pad excessively, then trim
Ansatz , 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.
quelle
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.
quelle
other stuff \tMyString\t more stuff
zu seinother stuff \tMyString_____________\t more stuff
? Das ist das Szenario, in dem ich mich im Grunde befinde.