# Java Straße und Hausnummer



## JavaMaus1 (13. Mai 2011)

Hallo liebe Forum-ler,

in unserem Primärsystem werden Straße und Hausnummer in einen String geschrieben. Diesen String würde ich gerne in den ausgehenden Nachrichten zerlegen in Starße und Hausnummer damit die Subsysteme diese Information korrekt abspeichern.

Habe schon zur genöge gegoogelt und weiß, dass es kein ganz sauberer RegEx gibt. Mit würde eine 80% Lösung schon reichen. Also so:

Teststraße 1 --> String Straße und String Nummer

Mir ist bewusst, dass es bei Kombinationen wie Straße des 17. Juni 19 dann nicht sauber läuft. Oder kann man die letzte Zahl in einem String suchen und diese dann in einen String herauschreiben mit allem was dahinter kommt an Buchstaben? (ich danke da an Straße des 17. Juni 19b... also in dem Fall bis zur letzen Zahl suchen (19) und ab der Zahl einen neuen String beginnen - sodass 19 b in dem neuen String steht?

Viele sonnige Grüße!


----------



## Tomate_Salat (13. Mai 2011)

Funktioniert mit meinen Tests ganz gut:

```
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexStr 
{
	public static void main(String[] args) 
	{
		String[] str= {
				"Standardstr 12",
				"Saubere Nummer 13",
				"Die tolle Allee 14b"		
		};
		
		for(String s : str) {
			Matcher m = Pattern.compile("^(.*?) (\\d*?[a-zA-Z]{0,}?)$").matcher(s);
			if(m.matches()) {
				System.out.println(m.group(1) + " <--> " + m.group(2));
			}
		}
	}
}
```

Ausgabe:

```
Standardstr <--> 12
Saubere Nummer <--> 13
Die tolle Allee <--> 14b
```

*Anmerkung:* Setzt vorraus dass in dem String wirklich nur die Straße + Hausnummer steht.


----------



## faetzminator (13. Mai 2011)

Ach, zu spät...
trotzdem, hier meine Lösung (oder besser gesagt mein Regex)


```
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Foo {

    public static void main(String[] args) {

        String[] values = {"foostrasse 3", "Strasse des 17. Juni 19", "blaweg 34a", "im hinteracker"};
        Pattern pattern = Pattern.compile("(.+[^\\s])\\s+(\\d+\\w*)");
        for (String street : values) {
            String number = "";
            Matcher matcher = pattern.matcher(street);
            if (matcher.matches()) {
                street = matcher.group(1);
                number = matcher.group(2);
            }
            System.out.println("strasse: " + street + " / nummer: " + number);
        }
    }
}
```

Edit:
@Tomate: du hast vergessen, dass es auch Strassen/Höfe/wasauchimmer ohne Nummern geben kann. Bei meinem Beispiel "im hinteracker" kommt dann bei dir [c]im <--> hinteracker[/c] raus.


----------



## Tomate_Salat (13. Mai 2011)

faetzminator hat gesagt.:


> Edit:
> @Tomate: du hast vergessen, dass es auch Strassen/Höfe/wasauchimmer ohne Nummern geben kann. Bei meinem Beispiel "im hinteracker" kommt dann bei dir [c]im <--> hinteracker[/c] raus.



nope, ich habs nicht vergessen, ich habs nicht gewusst. Dachte eine Adresse setzt sich immer aus Straßenname+Hausnummer zusammen. Ist mir bisher nie aufgefallen, dass es auch ohne geht.


----------



## Crian (13. Mai 2011)

Bei uns im Haus ist das Programm, dass das "sauber" macht, ziemlich lang. Viel Erfolg.


----------



## faetzminator (13. Mai 2011)

Crian hat gesagt.:


> Bei uns im Haus ist das Programm, dass das "sauber" macht, ziemlich lang. Viel Erfolg.



Und auf was wird das beruhen? Erfahrung.

Ich würde das in unserem Code mit diesen Beispielen Unit-Testen und bei Problemen Spezialfälle hinzufügen.
Oder wie denkst du, dass ich Kontoprüfungen ohne Spezifikationen implementiere  ?


----------



## FArt (13. Mai 2011)

faetzminator hat gesagt.:


> Oder wie denkst du, dass ich Kontoprüfungen ohne Spezifikationen implementiere  ?



Gar nicht. Ein Entwickler ist nie so erfinderisch, wie die Realität. ;-)


----------



## faetzminator (13. Mai 2011)

FArt hat gesagt.:


> Gar nicht. Ein Entwickler ist nie so erfinderisch, wie die Realität. ;-)



Ach was  3 Releases später hat der dann Mal alle internen Spezialkonstellationen gekannt - von Fremdinstituten ganz zu schweigen


----------



## Crian (13. Mai 2011)

faetzminator hat gesagt.:


> Und auf was wird das beruhen? Erfahrung.



Genau. Und viele Millionen Daten.


@TE: Wundere dich nicht, wenn Adressdaten noch viel viel bunter aussehen, als man sich das so beim ersten Mal fröhlich vorstellt. Mit Glück sind noch c/o Angaben, Stockwerke, Aufgänge, Hinterhöfe, Toreinfahrten, andere Bezeichnungen des Gebäudes etc. pp. dabei. Und "Astraße 5 / Bchaussee 16" als Eckadresse wird auch vorkommen.


----------



## faetzminator (13. Mai 2011)

Crian hat gesagt.:


> Genau. Und viele Millionen Daten.



Genau das meine ich mit Erfahrung


----------



## slawaweis (13. Mai 2011)

eine Universallösung wird es dafür nicht geben. In solchen Fällen kommt es wirklich auf die Erfahrung und die Datenbestände an. Am besten implementiert man verschiedene einfache Filter und verkettet diese hintereinander, z.B. "Text Nummer", "Text NummerBuchstabe", "Text Text Nummer", ... usw. Die Adresse muss durch die Filter durch, bis einer *genau* zutrifft. Wenn es nicht der Fall ist, sollte *ein Mensch* benachrichtigt werden, welcher die Adresse ansieht, diese eventuell verifiziert/korrigiert und dafür einen neuen Filter entwickelt. So vermeidet man, dass durch unerwartete Adressarten die Post am falschen Ort landet.

Slawa


----------



## JavaMaus1 (16. Mai 2011)

Danke euch allen! Hat mir sehr geholfen & hat wunderbar geklappt!


----------

