regexp für Telefonnummerumwandlung

regexp für Telefonnummerumwandlung

am 15.03.2006 15:20:13 von Marten Lehmann

Hallo,

ich möchte eine Telefonnummer vom Format +49-123-456-789-012 umwandeln
in +49-123-45678912. Die Telefonnummern haben mindestens zwei
Bindestriche für Länder- und Ortskennung. Alle optionalen Bindestriche
in der eigentlichen Rufnummer sollen aber entfernt werden. Im
Zweifelsfall würde ich einfach ein split mit max. 3 Elementen machen,
beim letzten Element die Bindestriche entfernen und dann wieder
zusammensetzen. Wäre das auch als regulärer Ausdruck machbar?

Tschüß
Marten

Re: regexp für Telefonnummerumwandlung

am 15.03.2006 15:27:11 von Marten Lehmann

Hi,

ich hatte das gerade noch als Einzeiler probiert:

$phone = "+49-123-456-789-012";
$phone = join(" ", (split("-", $phone, 3))[0, 1], (((split("-", $phone,
3))[2]) =~ s/-//g));

erhalte dann aber

Can't modify list slice in substitution (s///) at ./test.pl line 9, near
"s/-//g)"

Gibt es eine Möglichkeit den regulären Ausdruck on-the-fly anzuwenden
oder muß ich immer eine temporäre Variable erzeugen? Sind die regulären
Ausdrücke überhaupt als Funktion nutzbar (so wie in PHP mit
preg_replace) oder immer nur über den =~ Operator?

Tschüß
Marten

Re: regexp fürTelefonnummerumwandlung

am 15.03.2006 16:28:17 von Lukas Mai

Marten Lehmann schrob:
> Hallo,
>
> ich möchte eine Telefonnummer vom Format +49-123-456-789-012 umwandeln
> in +49-123-45678912. Die Telefonnummern haben mindestens zwei
> Bindestriche für Länder- und Ortskennung. Alle optionalen Bindestriche
> in der eigentlichen Rufnummer sollen aber entfernt werden. Im
> Zweifelsfall würde ich einfach ein split mit max. 3 Elementen machen,
> beim letzten Element die Bindestriche entfernen und dann wieder
> zusammensetzen. Wäre das auch als regulärer Ausdruck machbar?

Im Prinzip ja.

1 while $t =~ s/^((?:[^-]*-){2}[^-]*)-/$1/;

$t =~ s{^((?:[^-]*-){2})(.*)}{
my $s = $2;
$s =~ tr/-//d;
$1 . $s
}se;

if ($t =~ /^(?:[^-]*-){2}/) {
substr($t, $+[0]) =~ tr/-//d;
}

So richtig schön sind die aber alle nicht.

HTH, Lukas

Re: regexp für Telefonnummerumwandlung

am 15.03.2006 16:48:22 von Wolf Behrenhoff

Marten Lehmann schrieb:
> Hallo,
>
> ich möchte eine Telefonnummer vom Format +49-123-456-789-012 umwandeln
> in +49-123-45678912. Die Telefonnummern haben mindestens zwei
> Bindestriche für Länder- und Ortskennung. Alle optionalen Bindestriche
> in der eigentlichen Rufnummer sollen aber entfernt werden. Im
> Zweifelsfall würde ich einfach ein split mit max. 3 Elementen machen,
> beim letzten Element die Bindestriche entfernen und dann wieder
> zusammensetzen. Wäre das auch als regulärer Ausdruck machbar?

Ich schlage vor:
$_='+49-123-456-789-012';
1 while s/(-.*-.*)-/$1/;
print;

Wolf

Re: regexp für Telefonnummerumwandlung

am 16.03.2006 10:28:07 von Christian Winter

Marten Lehmann schrieb:
> ich möchte eine Telefonnummer vom Format +49-123-456-789-012 umwandeln
> in +49-123-45678912. Die Telefonnummern haben mindestens zwei
> Bindestriche für Länder- und Ortskennung. Alle optionalen Bindestriche
> in der eigentlichen Rufnummer sollen aber entfernt werden. Im
> Zweifelsfall würde ich einfach ein split mit max. 3 Elementen machen,
> beim letzten Element die Bindestriche entfernen und dann wieder
> zusammensetzen. Wäre das auch als regulärer Ausdruck machbar?

my $c = 0;
s/-/$c++<2?$&:''/eg;

-Christian

Re: regexp für Telefonnummerumwandlung

am 16.03.2006 13:41:03 von Frank Seitz

Christian Winter wrote:

> my $c = 0;
> s/-/$c++<2?$&:''/eg;

Hey, die Lösung gefällt mir!

Schade, dass man die Matches selber mitzählen muss und Perl
keine vordefinierte Variable dafür hat.
Oder kennt jemand sowas?

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: regexp für Telefonnummerumwandlung

am 16.03.2006 16:48:43 von timwi

Marten Lehmann wrote:
> Hallo,
>
> ich möchte eine Telefonnummer vom Format +49-123-456-789-012 umwandeln
> in +49-123-45678912. Die Telefonnummern haben mindestens zwei
> Bindestriche für Länder- und Ortskennung. Alle optionalen Bindestriche
> in der eigentlichen Rufnummer sollen aber entfernt werden. Im
> Zweifelsfall würde ich einfach ein split mit max. 3 Elementen machen,
> beim letzten Element die Bindestriche entfernen und dann wieder
> zusammensetzen. Wäre das auch als regulärer Ausdruck machbar?

Hast du dich auch mit den Telefonnummernregeln aller Länder beschäftigt?
Soweit ich informiert bin, muss z.B. in Italien die 0 bei der
Ortsvorwahl erhalten bleiben, selbst wenn der Ländercode +39 davorsteht.
In Nordamerika hingegen gilt der völlig chaotische, unübersichtliche und
schlecht durchdachte North American Numbering Plan (NANP), viel Spaß damit!

Timwi