RegExp: Ziffernfolge zerteilen
Gerd
- perl
0 Tim Tepaße0 Siechfred0 Gerd
Hallo,
Hilfe, ich komm nicht weiter !
Ich habe einen langen Ziffernstring, eine Aneinanderreihung von
jeweils 3 Ziffern, z.B. "647837552663748", d.h.,
"647", "837", "552", "663", und "748" sind ohne Trennung
aneinandergereiht.
Ich möchte nun mit einem regulären Ausdruck diese Folge
splitten und ein Trennzeichen einfügen, so daß ein String in
der Form "647-837-552-663-748" entsteht.
Wie knack ich die Nuß (für Experten doch sicher ein Kinderspiel,
oder ? :-)))
Vielen Dank und lieben Gruß
Gerd.
Hallo Gerd,
Ich möchte nun mit einem regulären Ausdruck diese Folge
splitten und ein Trennzeichen einfügen, so daß ein String in
der Form "647-837-552-663-748" entsteht.
Zuallererst: Ich habe es geschafft, mich bis gerade noch nie mit Regulären
Ausdrücken zu beschäftigen. Hätte ich Dein Problem gehabt, ich hätte eine
Methode geschrieben, die einen String bekommt, ein Sicherheitsabfrage macht,
ob denn die Anzahl der Zeichen in der Zeichenkette ein Vielfaches von drei
ist und wäre dann mit einer Schleife zeichenweise den String durchgegangen
und alle drei Zeichen ein Minuszeichen eingefügt. Uuuumständlich.
Gottseidank hat Deine Anfrage mich endlich mal dazu gebracht, mir zumindest
die Grundlagen für Reguläre Ausdrücke anzugucken. In diesem Fall auf dieser
Seite in SELFHTML.
http://selfhtml.teamone.de/cgiperl/sprache/regexpr.htm
Aufgrund dieses bischen Wissens will ich nun mal versuchen, Dein Problem
aufzudröseln. Einfach, um dadurch selber etwas zu lernen. Echte Experten
mögen bitte dazwischenschreien, wenn ich dann doch was flashc mache.
Suchen und ersetzen findet in Perl mit Regulären Ausdrücken so statt:
$Zeichenkette =~ s/Suchmuster/Ersatzzeichenkette/[Flags]
Als Flag dürfte hier das "g" verwendet werden, da ich global in der
Zeichenkette suchen will.
Meine Idee für das Suchmuster ist jetzt, nach drei aufeinanderfolgenden
Zahlen zu suchen und dann als Ersatzzeichenkette die drei Zeichen plus
dem Minuszeichen auszugeben.
Das Suchmuster für eine Zahl ist einfach, entweder /[0-9]/ oder /\d/.
Erstere Variante ist mir optisch sympathischer, also behalte ich diese
mal bei.
Um nach drei Zahlen zu suchen ist das Suchmuster folglich also /[0-9][0-9][0-9]/ oder mit Wiederholungangabe /[0-9]{3}/.
Ich will die gefundene Teilzeichenkette von drei Zeichen aber in der
Ersatzzeichenkette weiterverwenden. Also muß ich sie einklammern, damit
das auch klar ist: /([0-9]{3})/
Nun zur Ersatzzeichenkette. Ich will die Teilzeichenkette aus dem Suchmuster
wieder ausgeben und dann ein Minuszeichen anfügen. Auf die Teilzeichenkette
habe ich mit der Variablen $1 Zugriff. So wie ich das sehe, muß das
Minuszeichen nicht maskiert werden, kann also so an die Variable
angefügt werden: /$1-/
So komme ich dann zu diesem vollständigen Ausdruck...
s/([0-9]{3})/$1-/g
... und erwarte nun eine positive oder eine Negative Rückmeldung von Dir
oder anderen Experten. Ich bin noch unsicher, ob mein in 10 Minuten
angelesenes Wissen und der schnell dahingedengeltes Ausdruck wirklich
stimmt.
Ein Problem sehe ich noch. Ich weiß nicht genau, was Du mit diesem Ausdruck
und der entstehenden Zeichenkette anfangen willst. Wenn die anfängliche
Zeichenkette kein Vielfaches von drei ist, dann können eventuell Probleme
für Dich entstehen.
Ich setze einfach mal voraus, daß der Suche- und Ersetze-Ausdruck die
Zeichenkette von vorne nach hinten durchläuft. Bei einer Zeichenkette, die
kein Vielfaches von drei ist, können dann am Ende Zeichen übrigbleiben, die
eben kein Dreierblock sind. Zum Beispiel
...-567-8
...-567-89
Ich weiß nicht, ob das für Dich wichtig ist, aber eventuell solltest Du
eine Sicherheitsabfrage einkalkulieren.
Hallo Gerd,
Ich möchte nun mit einem regulären Ausdruck diese Folge
splitten und ein Trennzeichen einfügen, so daß ein String in
der Form "647-837-552-663-748" entsteht.
Du kannst es auch ohne RegEx lösen:
my $str = "1234567890";
my $laenge = length($str);
for(my $a = 0; $a < $laenge; $a=$a+3) {
$add = substr($str, $a, 3);
push(@splitted, $add);
}
$new_str = join("-", @splitted);
(Gestestet, funktioniert)
Wie knack ich die Nuß (für Experten doch sicher ein Kinderspiel,
oder ? :-)))
Ich bin kein Experte, sonst könnte ich das vielleicht mit regulären Ausdrücken lösen ;-)
mfg Torsten
Hallo,
dank Euch, klappt super.
Vor allem Tim hat sich ja mächtig ins Zeug gelegt und hat
jetzt ein "Buch mit sieben Siegeln" (RegExp !) weniger im Regal.
Viel Spaß noch damit, ich verwende die Dinger oft, komme
nur immer wieder mal einfach nicht auf den Trichter und
frage dann hier nach.
Gruß Gerd.
Hallo Gerd,
dank Euch, klappt super.
Das freut mich.
Vor allem Tim hat sich ja mächtig ins Zeug gelegt und hat
jetzt ein "Buch mit sieben Siegeln" (RegExp !) weniger im Regal.
Oh ja. Perl ist jetzt dadurch auf meiner Liste der Dinge, mit denen ich
mich unbedingt beschäftigen will, nach ziemlich weit oben gerutscht.
Und ich frage mich noch immer, wie ich so lange so blind auf diesem Auge
sein konnte. Danke! ;o)