Font
[thread]7650[/thread]

regex: newbie frage zum ersetzen (s///)

Reader: 1


<< |< 1 2 >| >> 15 entries, 2 pages
Lutz
 2006-01-25 19:11
#62241 #62241
User since
2006-01-25
2 articles
BenutzerIn
[default_avatar]
Hallo,

ich brauch eure hilfe mit einem search&replace pattern. Was ich tun will ist, in einem datum alle einzifferigen Tages- und Monatsangaben mit einer vorangehenden Null zu ersetzen.
Beispiel: aus '25-1-2006' soll werden: '25-01-2006'

Code: (dl )
1
2
$d = "25-1-2006";
$d =~ s/(\D?)(\d{1})(\D{1})/$1(0$2)$3/g;

gibt mir allerdings folgendes:
'2(05)-(01)-2006'

Wenn ich die Klammern im Replace-Pattern weglasse, wertet er allerdings die Null nicht als vorangehenden String. Wie kriege ich den Ausdruck so umgebogen, dass er
a) in Search wirklich nur einzelne Ziffern matched, und
b) im Replace 0$2 auswertetn, $1 und $3 aber unverändert ausgibt? Und das Ganze dann bitte noch ohne Leer- oder sonstige Sonderzeichen?

Damit bin ich echt am verzweifeln. Hoffentlich kann mir jemand von euch weiter helfen. Vielen Dank schonmal.
Relais
 2006-01-25 19:49
#62242 #62242
User since
2003-08-06
2244 articles
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
s/-(\d)-/-0$1-/g;


oder

Code: (dl )
s/(\d+)-(\d+)-(\d+)/sprintf("%02d-%02d-%04d", $1,$2,$3)/eg;
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
Relais
 2006-01-25 19:50
#62243 #62243
User since
2003-08-06
2244 articles
ModeratorIn
[Homepage] [default_avatar]
und das /g am Ende brauchst Du nicht. Probier einfach mal aus, was passiert, wenn Du es im eigenen Beispiel weg läßt, dann siehst Du, was schief gegangen ist.
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
pq
 2006-01-25 19:53
#62244 #62244
User since
2003-08-04
12208 articles
Admin1
[Homepage]
user image
[quote=Relais,25.01.2006, 18:49]
Code: (dl )
s/-(\d)-/-0$1-/g;
[/quote]
das klappt nicht bei '3-1-2006', da der 2. bindestrich schon gematcht ist.
und es klappt sowieso nicht, da vor der ersten zahl kein bindestrich ist.
besser ist wohl \b\n\n

<!--EDIT|pq|1138211690-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
bloonix
 2006-01-25 19:54
#62245 #62245
User since
2005-12-17
1615 articles
HausmeisterIn
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
my @datuemer = ( '2005-1-23',
                '2005-12-27',
                '2005-11-2',
                '2005-7-9',
);

s/(\d+)-(\d+)-(\d+)/sprintf '%04d-%02d-%02d', $1, $2, $3/e for @datuemer;
\n\n

<!--EDIT|opi|1138211731-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2006-01-25 20:05
#62246 #62246
User since
2005-12-17
1615 articles
HausmeisterIn
[Homepage]
user image
[quote=Relais,25.01.2006, 18:49]
Code: (dl )
s/(\d+)-(\d+)-(\d+)/sprintf("%02d-%02d-%04d", $1,$2,$3)/eg;
[/quote]
Zwischen Thread lesen, Testskript schreiben, testen und
Antwort mit Beispiel posten sollte ich vielleicht nochmal
aktualisieren, damits net doppelt abgeschickt wird :-)
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Relais
 2006-01-26 00:44
#62247 #62247
User since
2003-08-06
2244 articles
ModeratorIn
[Homepage] [default_avatar]
[quote=pq,25.01.2006, 18:53][quote=Relais,25.01.2006, 18:49]
Code: (dl )
s/-(\d)-/-0$1-/g;
[/quote]
das klappt nicht bei '3-1-2006', da der 2. bindestrich schon gematcht ist.
und es klappt sowieso nicht, da vor der ersten zahl kein bindestrich ist.
besser ist wohl \b[/quote]
Interessante Begründung (ich verstehe sie nicht), Jedoch klappt es:

> perl -wle '$d = "3-1-2006"; $d =~ s/-(\d)-/-0$1-/g; print $d'
3-01-2006
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
renee
 2006-01-26 04:42
#62248 #62248
User since
2003-08-04
14371 articles
ModeratorIn
[Homepage] [default_avatar]
[quote=opi,25.01.2006, 19:05]Zwischen Thread lesen, Testskript schreiben, testen und
Antwort mit Beispiel posten sollte ich vielleicht nochmal
aktualisieren, damits net doppelt abgeschickt wird :-)[/quote]
Besser zweimal als gar nicht...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Lutz
 2006-01-26 12:28
#62249 #62249
User since
2006-01-25
2 articles
BenutzerIn
[default_avatar]
super, danke für eure schnelle hilfe.
Code: (dl )
s/(\d+)-(\d+)-(\d+)/sprintf '%04d-%02d-%02d', $1, $2, $3/e

ist genau das, was ich gebraucht habe. :)
Crian
 2006-01-26 16:05
#62250 #62250
User since
2003-08-04
5866 articles
ModeratorIn
[Homepage]
user image
[quote=Relais,25.01.2006, 23:44]> perl -wle '$d = "3-1-2006"; $d =~ s/-(\d)-/-0$1-/g; print $d'
3-01-2006[/quote]
Der OP wollte aber alle einstelligen Felder mit einer führenden Null versehen.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 15 entries, 2 pages



View all threads created 2006-01-25 19:11.