Java Straße und Hausnummer

JavaMaus1

Mitglied
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!
 
Funktioniert mit meinen Tests ganz gut:
Java:
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:
Code:
Standardstr <--> 12
Saubere Nummer <--> 13
Die tolle Allee <--> 14b

Anmerkung: Setzt vorraus dass in dem String wirklich nur die Straße + Hausnummer steht.
 
Ach, zu spät...
trotzdem, hier meine Lösung (oder besser gesagt mein Regex)

Java:
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.
 
Zuletzt bearbeitet:
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.
 
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.
 
Zuletzt bearbeitet:
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
 

Zurück
Oben