hilfdirselbst.ch
Facebook Twitter gamper-media
Sonador S
Beiträge: 137
2. Sep 2017, 13:02
Beitrag #1 von 12
Bewertung:
(1538 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

GREP-Frage


Hallo zusammen,

ich bastel gerade an einer GREP-Suche die führende Nullen zu Datumsangaben hinzufügt.

Beispiele:
1.12.2017 wird zu 01.12.2017
1.1.2017 wird zu 01.01.2017


SUCHEN
Code
(?<!\d)(\d)(?=\.\d\d?\.\d\d)|(?<=\d\.)(\d)(?=\.\d\d) 


ERSETZEN
Code
0$0 



ERSTER TEIL (Tagesangabe):
Code
(?<!\d)(\d)(?=\.\d\d?\.\d\d) 

Findet 1.2.2017
Ersetzt 01.2.2017

Findet 1.12.2017
Ersetzt 01.12.2017


ZWEITER TEIL (Monatsangabe):
Code
(?<=\d\.)(\d)(?=\.\d\d) 

Findet 1.1.2017
Ersetzt 1.01.2017


Leider läuft das nicht in einem Rutsch durch. Ich muss Suchen und Ersetzen zwei mal auslösen (Was sogar zu einem Fehler führt, wenn vom ersten Suchdurchlauf noch eine Ziffer markiert ist).

Könnt ihr mir auf die Sprünge helfen?

Danke schon mal.

Grüße
Michael
Top
 
X
Thomas Richard  M  p
Beiträge: 17496
2. Sep 2017, 13:48
Beitrag #2 von 12
Beitrag ID: #559316
Bewertung:
(1531 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

GREP-Frage


Auf die Schnelle in deinen ersten grep geschaut: Warum duchst du auch mehrstellige Zahlen? Du musst doch nur an die einstelligen?

Bisschen kurz weil vom handy aus. ;)


MfG

Thomas


Und wenn dir geholfen wurde, hilf uns, dies auch weiterhin zu können.
http://www.hilfdirselbst.ch/info/
als Antwort auf: [#559315] Top
 
Sonador S
Beiträge: 137
2. Sep 2017, 14:05
Beitrag #3 von 12
Beitrag ID: #559317
Bewertung:
(1526 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

GREP-Frage


Ich könnte natürlich auch einfach nach

»Keine Ziffer | Ziffer | Punkt« suchen ([^\d]\d\.)

Aber dann findet er auch das hier:

1.000.000 €

5.12 Uhr

Durch die Suche nach »Ziffer | Punkt | Ziffer | Ziffer | Punkt | Ziffer | Ziffer« kommt eigentlich nur ein Datum in Frage.


Oder habe ich deine Frage falsch verstanden?


Grüße
Michael
als Antwort auf: [#559316] Top
 
Thomas Richard  M  p
Beiträge: 17496
2. Sep 2017, 17:41
Beitrag #4 von 12
Beitrag ID: #559318
Bewertung:
(1497 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

GREP-Frage


Grundsätzlich brauchst du zwei Suchen. Weil du nach zwei verschiedenen 1stelligen Ziffern suchst, und das drumherum zur Ausgrenzung von anderen Zahlen mit Punkten drin brauchst.

Und du eh zweimal durchlaufen lassen müsstest, weil er mit deinem 'oder' Pipe beim 1.1.2017 (also 2 Treffer in einem Datum) ja auch immer nur eine von beiden einsen trifft.

Ich hab die zwei unterteilt in einen grep für einstellige Tage:
\<(\d)(?=\.\d{1,2}\.\d{4})
mit der Ersetzung
0$1

und ein grep für einstellige Monate:
\<\d{1,2}\.\K(\d)(?=\.\d{4})
ebenfalls mit der Ersetzung
0$1

Die Variable Länge {1,2} der jeweils nicht gesuchten Ziffer, macht das ganze unabhängig von der Reihenfolge der beiden Suchen.

Wenn du auch 2stellige Jahreszahlen einschliessen musst, würde hinten aus dem {4} ein {2,4}.


MfG

Thomas


Und wenn dir geholfen wurde, hilf uns, dies auch weiterhin zu können.
http://www.hilfdirselbst.ch/info/
als Antwort auf: [#559317] Top
 
Thomas Richard  M  p
Beiträge: 17496
2. Sep 2017, 17:47
Beitrag #5 von 12
Beitrag ID: #559319
Bewertung:
(1493 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

GREP-Frage


Wobei, ich habs gerade ausprobiert: Beide Suchausdrücke mit einem Pipe verbunden werden arg lang:

Code
\<(\d)(?=\.\d{1,2}\.\d{4})|(?<= )(\d)(?=\.\d{1,2}\.\d{4}) 


finden aber alles und müssten eben zur Sicherheit zweimal angestossen werden.


Grundsätzlich würde ich die Ersetzung aber genau andersherum laufen lassen. Diese nur vom Hirn beim Lesen dauernd zu unterdrückenden, vorne stehenden Nullen find ich sowas von nervig.


MfG

Thomas


Und wenn dir geholfen wurde, hilf uns, dies auch weiterhin zu können.
http://www.hilfdirselbst.ch/info/
als Antwort auf: [#559318] Top
 
Sonador S
Beiträge: 137
2. Sep 2017, 18:42
Beitrag #6 von 12
Beitrag ID: #559320
Bewertung:
(1477 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

GREP-Frage


Deine Aufteilung der GREP-Suchanfrage klappt. Kurz zum Verständnis. Was macht denn hier »\K«?

Bei deiner zweiten Variante mit Pipe stimmt etwas nicht. Copy-Paste-Fehler?

Für das entfernen einer führenden Null habe ich bereits ein GREP, das im Gegensatz zur bisher diskutierten Variante mit einem Durchlauf funktioniert:

Code
(?<!\d)(\d)(?=\.\d\.\d\d)|(?<!\d)(\d)(?=\.\d\d\.\d\d)|(?<=\d\.)(\d)(?=\.\d\d) 


Kannst du mir sagen, weshalb hier keine zwei Anläufe nötig sind?

Grüße
Michael
als Antwort auf: [#559319] Top
 
Thomas Richard  M  p
Beiträge: 17496
2. Sep 2017, 18:56
Beitrag #7 von 12
Beitrag ID: #559321
Bewertung:
(1474 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

GREP-Frage


Definitiv c&p Fehler.

Hab gerade keinen Rechner hier. Schaus mir später noch mal an.


MfG

Thomas


Und wenn dir geholfen wurde, hilf uns, dies auch weiterhin zu können.
http://www.hilfdirselbst.ch/info/
als Antwort auf: [#559320] Top
 
Thomas Richard  M  p
Beiträge: 17496
3. Sep 2017, 17:04
Beitrag #8 von 12
Beitrag ID: #559322
Bewertung:
(1345 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

GREP-Frage


Antwort auf: Deine Aufteilung der GREP-Suchanfrage klappt. Kurz zum Verständnis. Was macht denn hier »\K«?

Das ist ein positiver Lookbehind mit variabler Länge: Sinngemäß: Finde alles passende bis hierher aber nimms nicht mit in den Speicher.

Antwort auf: Bei deiner zweiten Variante mit Pipe stimmt etwas nicht. Copy-Paste-Fehler?

Jepp, so wars gemeint:
Code
\<\d{1,2}\.\K(\d)(?=\.\d{4})|\<(\d)(?=\.\d{1,2}\.\d{4}) 

Ersetzung: 0$0

Antwort auf: Für das entfernen einer führenden Null habe ich bereits ein GREP, das im Gegensatz zur bisher diskutierten Variante mit einem Durchlauf funktioniert:

Code
(?<!\d)(\d)(?=\.\d\.\d\d)|(?<!\d)(\d)(?=\.\d\d\.\d\d)|(?<=\d\.)(\d)(?=\.\d\d) 


Mit welcher Ersetzung? Aber davon ab, findet der mit auch nur einstellige Tage und Monate. Und da müsstest du doch nur nach Nullen suchen, nicht nach \d sonst wird aus dem 21. der 1.
Auch c&p Fehler?

Antwort auf: Kannst du mir sagen, weshalb hier keine zwei Anläufe nötig sind?

Evtl. liegts an der Reihenfolge. Wenn du 2 oder-Pipes einbaust und die Suche nach dem doppelt-einstelligen Treffer nach vorne nimmst, werden die zuerst gefunden, aber die bräuchten dann auch wieder ne andere Ersetzung als die Treffer, die nur Monat oder Tag aufweisen...


MfG

Thomas


Und wenn dir geholfen wurde, hilf uns, dies auch weiterhin zu können.
http://www.hilfdirselbst.ch/info/
als Antwort auf: [#559320]
(Dieser Beitrag wurde von Thomas Richard am 3. Sep 2017, 17:07 geändert)
Top
 
Sonador S
Beiträge: 137
8. Sep 2017, 16:11
Beitrag #9 von 12
Beitrag ID: #559375
Bewertung:
(1119 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

GREP-Frage


Hallo Thomas,

sorry für die späte Antwort.

Ich hatte versehentlich die falsche GREP-Funktion hier gepostet.
Die GREP-Funktion zum entfernen von Nullen, welche in einem Rutsch durchläuft lautet:

Code
(0(?=\d\.\d\d\.\d\d))|(0(?=\d\.\d\.\d\d))|((?<=\d\.)0(?=\d\.\d)) 



Ersetzt wird mit nichts. Und funktioniert mit einem Durchlauf. Die Funktion zum entfernen leider nicht.

Grüße
Michael
als Antwort auf: [#559322] Top
 
pixxxelschubser p
Beiträge: 1508
9. Sep 2017, 00:34
Beitrag #10 von 12
Beitrag ID: #559381
Bewertung:
(1088 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

GREP-Frage


Zum Entfernen führender Nullen könntest du auch „andersherum“ vorgehen:
Suchen nach Datum
0?(\d{1,2}\.)0?(\d{1,2}\.[12]\d{3})
und Ersetzen durch
$1$2

Die eventuell vorhandenen Nullen bleiben dadurch einfach „auf der Strecke“. Und das funktioniert auch ohne mehrfach hintereinandergeschaltete Oder-Bedingungen.

viele Grüße
pixxxelschubser




Was wir wissen, ist ein Tropfen; was wir nicht wissen, ein Ozean.

Isaac Newton


als Antwort auf: [#559375] Top
 
Sonador S
Beiträge: 137
9. Sep 2017, 11:46
Beitrag #11 von 12
Beitrag ID: #559384
Bewertung:
(1060 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

GREP-Frage


Jo, findet allerdings auch 1.1.2017 und führt dafür einen Suchen- und Ersetzen-Vorgang aus, obwohl das ja garnicht nötig wäre. Könnte irritieren.


Grüße
Michael
als Antwort auf: [#559381] Top
 
Thomas Richard  M  p
Beiträge: 17496
9. Sep 2017, 18:25
Beitrag #12 von 12
Beitrag ID: #559386
Bewertung:
(1027 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

GREP-Frage


Ich habs damit probiert:
Code
0(?=\d\.\d{2}\.\d{4}|\d\.\d{4}) 

Ersetzen mit nichts. – findet alles in einem Durchgang.


MfG

Thomas


Und wenn dir geholfen wurde, hilf uns, dies auch weiterhin zu können.
http://www.hilfdirselbst.ch/info/
als Antwort auf: [#559384]
(Dieser Beitrag wurde von Thomas Richard am 9. Sep 2017, 18:29 geändert)
Top
 
X