Tim Tepaße: RegExp: Ziffernfolge zerteilen

Beitrag lesen

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.

  • Tim