# Brauche Hilfe bei RegEx...



## Ticks (23. November 2018)

Ich möchte eine beliebig lange Zahlenkette besser lesbar machen, indem ich vom Ende der Zahlenkette aus immer nach 3 Stellen einen Punkt (.) setze. Die Länge der Zahlenkette ist mindestens 4 Zeichen lang und ansonsten in der Länge nicht begrenzt.

Beispiele:
123456  ->  123.456
12345  ->  12.345
1234567890  ->  1.234.567.890

Soweit bin ich gekommen:

(\d{3})?$*
.$1

Das funktioniert bei 6-, 9-, 12-, 15-, 18-stelligen Zahlenketten jedoch nicht bei 4-, 5-, 7-, 8-, 10-, 11-, 13-, 14-, 16-, 17-stelligen Zahlenketten.

z.B:
4-stellig = 123.4 (falsch)  richtig wäre: 1.234
5-stellig = 123.45 (falsch)  richtig wäre: 12.345
8-stellig = 123.456.7.8  (falsch)  richtig wäre: 12.345.678

Ach ja, die Punkte am Anfang und Ende sind nicht das Problem, die entferne anders... 

Vielen Dank im voraus für eure Hilfe Und Gruß, Ticks


----------



## basti1012 (23. November 2018)

Regex ist nicht mein ding aber eine Lösung ohne Regex könnte so sein

Link zur Lösung


----------



## Ticks (23. November 2018)

Vielen Dank, aber damit kann ich leider nichts anfangen. 

Ich brauche RegEx, da ich dies nicht anders in einen Kurzbehl einbauen kann. 

Es geht um Altersberechnungen. Das Alter wird anhand des Geburtsdatums in Jahren, Monaten, Wochen, Tagen, Stunden, Minuten und Sekunden berechnet. 

Ich benötige das RegEx, um das ganze übersichtlicher darzustellen. Gerade bei Minuten und Sekunden ist das sehr hilfreich. 

Gruß, Ticks


----------



## Yaslaw (23. November 2018)

Kannst du den String zum parsen umdrehen?
Das Problem ist, dass der RegEx von vorne beginnt.

Hier die Lösung mit dem Verdrehten String:
Mein Test bei regex101

```
global
(\d{3})\B
$1.
```

Also je nach Sprache:

```
$result = strrev(preg_replace('/(\d{3})\B/g', '.$1', strrev($myNumber)));
```

Nachtrag:
*Gibt es in der Sprache keinen Format-Befehl?*


----------



## vfl_freak (23. November 2018)

Moin,


Ticks hat gesagt.:


> aber damit kann ich leider nichts anfangen


mit der Seite oben kann Du eigene reguläre Ausdrücke online testen und dann ggf. in Dein Programm übernehmen!!

VG Klaus


----------



## Ticks (23. November 2018)

So, ich habe das Problem dank eurer Hilfe lösen können. Und zwar komplett mittels RegEx! 

Ich habe ermittelt, daß ich in meinen Berechnungen nicht mehr als 15 Stellen inklusive Punkten benötige.

Zunächst lese ich die Zahlenkette ein und gebe sie rückwärts wieder aus.
`\b([^\s])([^\s])([^\s])([^\s])([^\s])([^\s])([^\s])([^\s])(?:([^\s])(?:([^\s])(?:([^\s])(?:([^\s])(?:([^\s])(?:([^\s])(?:([^\s]))?)?)?)?)?)?)?\b
$15$14$13$12$11$10$9$8$7$6$5$4$3$2$1`
Vorgabe:  *1234567890*
Ergebnis: *0987654321*

Dann setze ich in der rückwärtsstehende Zahlenkette die Punkte nach 3 Ziffern.
`(\d{3})\B
$1.`
Vorgabe:  *0987654321*
Ergebnis: *098.765.432.1*

Nun noch einmal das erste RegEx um die Zahlenkette wieder in die richtige Richtung zu drehen.
`\b([^\s])([^\s])([^\s])([^\s])([^\s])([^\s])([^\s])([^\s])(?:([^\s])(?:([^\s])(?:([^\s])(?:([^\s])(?:([^\s])(?:([^\s])(?:([^\s]))?)?)?)?)?)?)?\b
$15$14$13$12$11$10$9$8$7$6$5$4$3$2$1`
Vorgabe:  *098.765.432.1*
Ergebnis: *1.234.567.890*

Wahrscheinlich kann man diese RegEx noch verfeinern, aber es funktioniert einwandfrei.

Vielen Dank an alle und Gruß, Ticks.


----------



## Yaslaw (23. November 2018)

Eleganter ohne umzudrehen. Dafür in 2 Schritten
https://regex101.com/r/3hGEGl/4

```
(?:(\d{1,3})(?:(\d{3})(?:(\d{3})(\d{3})?)?)?)?(\d{3})$
$1.$2.$3.$4.$5
```
Das Resultatr hat noch zu viele Punkte drin

Diese dann noch entfernen:
https://regex101.com/r/3hGEGl/5

```
(?:^\.+|(\.)\.+)
$1
```


----------



## Ticks (23. November 2018)

Wow!!! Das gefällt mir sehr... 
Das nehme ich gerne!

Bin in Sachen RegEx blutiger Anfänger, aber es interessiert mich sehr, da man damit eine Menge machen kann wie ich sehe.

Lieben Dank nochmals und Gruß, Ticks


----------



## Yaslaw (23. November 2018)

Jepp, man kann relativ viel machen.
Es braucht aber immer wieder Zeit um einen bestgehenden zu zerlegen und zu verstehen


----------

