Methoden Straßennamen und Hausnummer - RegEx

Nametat

Mitglied
Guten Morgen,

ich würde gerne wissen, wie ich Straßennamen aufteilen kann, also in Straße und Hausnummer.
Ich habe schon diverse Seiten durchsucht und bin auf nichts konkretes gestoßen.

RegEx, Pattern usw habe ich ausprobiert, komme da aber nicht ganz klar, bzw habe ein paar Fragen.

Mein erster Ansatz war, die Straße in einer for schleife nach den Charaktern abzufragen und dann zu gucken ob es die erste zahl ist oder nicht,...

Java:
for( int index = 0; index < sStrasse.length(); index++ ) {
			char aktuellerCharakter = sStrasse.charAt( index );

			if( Character.isAlphabetic( aktuellerCharakter ) ) {
				bWarBuchstabe = true;
			}

			if( bWarBuchstabe ) {
				if( !bVonAnfangGesetzt && Character.isDigit( aktuellerCharakter )) {
					iVonAnfang = index;
					bVonAnfangGesetzt = true;
					continue;
				}
				
				if(index == sStrasse.length()){
					iVonEnde = index;
					iBisAnfang = index;
					iBisEnde = index;
					continue;
				}
				
				if(bVonAnfangGesetzt && !bVonEndeGesetzt 
					&& (!Character.isDigit( aktuellerCharakter ) 
					&& !Character.isAlphabetic( aktuellerCharakter)
					&& !Character.isWhitespace( aktuellerCharakter )) ){
					iVonEnde = index;
					bVonEndeGesetzt = true;
					continue;
				}
			}

Ich bin mir sicher, es geht leichter und übersichtlicher via RegEx.
Java:
Matcher m = Pattern.compile("\\d+").matcher(sStrasse);
        while (m.find()) {
            System.out.println(m.group());
	    System.out.println( m.start() ); // liest die Position der ersten Zahl aus
        }


Meine Frage ist nun, ob damit schon jemand Erfahrung gemacht hat und ob mir jemand Tipps geben kann, denn es gibt soooo schöne Straßennamen, die einen wieder alles auf den Haufen werfen können.

Java:
static String[] strassen = new String[]{
		"b 1" ,
		"Markt 10",
		"Albert-Einstein-Ring 15",
		"Tornschauer Str. 7",
		"Gersprenzweg 8a",
		"Mühlenstraße 17-21",
		"Neuendorferstr. 26",
		"Westerende 12/13",
		"Osterende 14 und 15",
		"Schwalbenweg 12 ; 13 ; 14",
		"Lerchenstraße 17 - 21",
		"Straße des 17. Juni 105",
		"Ackerweg 5 Hof 3 Gebäude 8",
		"Norderdamm43",
		"Schlehenweg 1 und 2",
		"164-Ring 5",
		"Gartenstraße 15 Seiteneingang"
	};

Es geht wirklich nur um die Straßennamen, keine PLZ oder ORT, nur Straßennamen.

Bin über jeden Tipp dankbar.
 
Wenn du regex nutzt kannst du zumindest zwischen Buchstaben und Zahlen leicht mit

Java:
final static String MY_STRING_REGEX = "[A-Z]+";
final static String MY_NUM_REGEX = "[0-9]+";


in verbindung mit
Code:
.matches();
unterscheiden.

[EDIT]
ggf. musst du dir dann noch eine regex erstellen welche auf nach Zahlen folgende Buchstaben reagiert, somit hättest du dann auch den Adress Zusatz abgedeckt .
[/EDIT]

Für weitere Erklärungen bin ich grad einfach zu Müde, ich schau mir das nachher nochmal in ruhe an 😳
 
Zuletzt bearbeitet:
Ich glaube ich habe es soweit hinbekommen.

So wird ein großteil der Straßen abgedeckt, jedoch nicht die mit Datum im Namen:

Java:
for( int i = 0; i < sStrasse.length(); i++ ) {
			char ausgesuchterCharakter = sStrasse.charAt( i );
			if(!Character.isDigit( ausgesuchterCharakter) && !bWarBuchstabe){
				iBuchstabenAnfang = i;
				bWarBuchstabe = true;
			}			
		}
		
		String sZwischenspeicher = sStrasse.substring( iBuchstabenAnfang);
		
		Matcher matcherErsteZahl = Pattern.compile( "\\d+" ).matcher( sZwischenspeicher );
		while( matcherErsteZahl.find() ) {
			if( iAnzahlZahlen == 0 ) {
				iVonAnfang = matcherErsteZahl.start() + iBuchstabenAnfang;
			}
			
			if( iAnzahlZahlen == 1 ) {
				iBisAnfang = matcherErsteZahl.start() + iBuchstabenAnfang;
			}
			
			iAnzahlZahlen++;
		}

		String sStrassenName = sStrasse.substring( 0, iVonAnfang ).trim();
		String sVonZahl = sStrasse.substring( iVonAnfang, iBisAnfang ).trim();
		String sBisZahl = sStrasse.substring( iBisAnfang, sStrasse.length() ).trim();

		teilung[0] = sStrassenName;
		teilung[1] = filtereStrasse( sVonZahl);
		teilung[2] = sBisZahl;

		return teilung;
	}

	public String filtereStrasse( String sStrasse ) {
		String sFilter = ",.-+/\\;:_";
		String text = "";

		for( int index = 0; index < sStrasse.length(); index++ ) {
			if( !sFilter.contains( sStrasse.charAt( index ) + "" ) ) {
				text += sStrasse.charAt( index );
			}
		}

		if( sStrasse.contains( "und" ) ) {
			text = sStrasse.replaceAll( "und", "" );
		}

		return text;
	}
 
Eine Alternative wäre auch:
Java:
String a = "ABCStraße 5";
int ls = a.lastIndexOf(" ");
String str = a.substring(ls);
String nummer = a.substring(ls, a.length-1);

Hierbei "Lastindex" für Fälle wie "Heinrich Schulze Straße 1b"
 
So wird ein großteil der Straßen abgedeckt, jedoch nicht die mit Datum im Namen:

Öhm , ist das Korrekt oder ? Warum sollte sich in einem Strassen Namen ein Datum befinden ?

Vielleich check ich auch einfach grad nur nicht was genau du meinst ?!😱
 
Eine Alternative wäre auch:

String a = "ABCStraße 5";
int ls = a.lastIndexOf(" ");
String str = a.substring(ls);
String nummer = a.substring(ls, a.length-1);

Hierbei "Lastindex" für Fälle wie "Heinrich Schulze Straße 1b"

Das Problem entsteht jedoch wieder bei folgenden Straßen, da mehrere Leerzeichen, auch in den Hausnummern vorhanden sind:

"Osterende 14 und 15"
"Schwalbenweg 12 ; 13 ; 14"
"Lerchenstraße 17 - 21"
"Straße des 17. Juni 105"
"Ackerweg 5 Hof 3 Gebäude 8"
"Markt 10 - 12"


Hier aus seinen Beispielen: "Straße des 17. Juni 105"

@Maskin: vollkommen Richtig! :toll:
 
Zuletzt bearbeitet:
"Straße des 17. Juni 105"

hab ich ehrlich gesagt beim überfliegen überlesen ^^

Jetzt die Frage : was genau willst du mit den einzelnen Straßennamen denn machen ?

bzw. wie und wo sollen die Namen denn weiterverarbeitet werden ?

ich würde z.B "Straße des 17. Juni 105" einfach , wie auch alle anderen Straßennamen in dessen Bestandteile zerlegen und in einer Liste zwischenspeichern.
Trennen kannst du doch so gut wie jedem Input einer Straße anhand der Leerzeichen ?

Sonst müsstest du halt bei gesonderten Straßennamen auch gesonderte Bedingungen schaffen

z.B "Albert-Einstein-Ring 15"

[EDIT]Was dich natürlich nicht daran hindert trotzdem die masse über regex zu filtern und zu trennen[/EDIT]

ich vermute mal du möchtest diese Adresse nicht nur zwischen dem namen und der Ziffer trennen, ergo müsstest du demnach eine gesonderte Bedingung schreiben die auf
Code:
-
auch gesondert reagiert, alles wirst du denke ich nicht mit Regex abarbeiten können , da einfach die Vielfalt doch ziemlich groß ist, was spezielle Fälle angeht.

Falls dem nicht so sein sollte und du diese Adresse z.B auch in 2 Teilen speichern könntest , kannst du auch einfach wieder bei dem Leerzeichen trennen.
 
Zuletzt bearbeitet:
Wieso machst du dir kein Model für Straße, anstatt ein String Array zu erstellen, welches du anschließend wieder auseinander friemeln musst.

Also statt:
Code:
static String[] strassen = new String[]{
        "b 1" ,
        "Markt 10",
        "Albert-Einstein-Ring 15",
        "Tornschauer Str. 7",
        "Gersprenzweg 8a",
        "Mühlenstraße 17-21",
        "Neuendorferstr. 26",
        "Westerende 12/13",
        "Osterende 14 und 15",
        "Schwalbenweg 12 ; 13 ; 14",
        "Lerchenstraße 17 - 21",
        "Straße des 17. Juni 105",
        "Ackerweg 5 Hof 3 Gebäude 8",
        "Norderdamm43",
        "Schlehenweg 1 und 2",
        "164-Ring 5",
        "Gartenstraße 15 Seiteneingang"
    };

Code:
  List<Straße> straßen = new ArrayList<Straße>();
  straßen.add(new Straße("Markt","10"));

Model:
Code:
public class Straße {
    
    private String name;
    private String hausnummer;
    
    public Straße(String name, String hausnummer) {
        this.name = name;
        this.hausnummer = hausnummer;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHausnummer() {
        return hausnummer;
    }

    public void setHausnummer(String hausnummer) {
        this.hausnummer = hausnummer;
    }
}
 
Das wäre zumindest ein recht OO Ansatz 😉 die Strassen jeweils als das was sie in Java nun auch sind anzusehen, nämlich Objekte, deren Attribute Name und Nummer wären , das war hier nur nicht gefordert 😀
 
Zuletzt bearbeitet:
Ich denke der Thread Ersteller wollte die Möglichkeit haben Straßen zu erstellen und auf einzelne Teile wie z.B. Hausnummer zuzugreifen zu können. Das Zerlegen von Strings ist dabei ein falscher Ansatz und mit unnötigem Aufwand verbunden. So etwas sollte objektorientiert gelöst werden.

ich würde gerne wissen, wie ich Straßennamen aufteilen kann, also in Straße und Hausnummer.

Erstell ein Straßen Objekt. 🙂

Galileo Computing :: Java ist auch eine Insel – 3 Klassen und Objekte
 
Zuletzt bearbeitet:
Ich denke der Thread Ersteller wollte die Möglichkeit haben Straßen zu erstellen und auf einzelne Teile wie z.B. Hausnummer zuzugreifen zu können. Das Zerlegen von Strings ist dabei ein falscher Ansatz und mit unnötigem Aufwand verbunden. So etwas sollte objektorientiert gelöst werden.

Zitat:
ich würde gerne wissen, wie ich Straßennamen aufteilen kann, also in Straße und Hausnummer.
Erstell ein Straßen Objekt.

@Aristro: Da liegst du leider falsch, bzw habe ich mich undeutlich ausgedrückt. Ich bekomme die Straßennamen als String und das Array ist nur zum Testen der Möglichkeiten gedacht. Mittlerweile ist die Liste der möglichen Straßennamen auch wieder länger geworden.

Java:
static String[] strassen = new String[]{
		"b 1",
		"A 1 45",
		"a 1",
		"o 1",
		"Markt 10",
		"Albert-Einstein-Ring 15",
		"Tornschauer Str. 7",
		"Gersprenzweg 8a2 - 14b",
		"Mühlenstraße 17-21",
		"Neuendorferstr. 26",
		"Westerende 12/13",
		"Westerende 18\\19",
		"Osterende 14 und 15",
		"Schwalbenweg 12 ; 13 ; 14",
		"Lerchenstraße 17 - 21",
		"Straße des 8.Mai",
		"Straße 103 13 - 35",
		"Ackerweg 5 Hof 3 Gebäude 8",
		"Norderdamm43",
		"Schlehenweg 1 und 2",
		"164-Ring 5",
		"Gartenstraße 15 Seiteneingang",
		"A 11 Ost",
		"An 44",
		"An den 10 Eichen",
		"An der Autobahn A 14",
		"An der B 200",
		"An der BAB 1",
		"An der K 66",
		"An der L 103",
		"Autobahn A 8/A81",
		"B 173",
		"B 224 (Nordseite Richtung Essen)",
		"BAB 13",
		"BAB 24 Südseite",
		"Backgasse 13a",
		"Bahnhofplatz 3,  Lenggries",
		"Birkenweiler 1.Gartenweg",
		"Durlacher Allee 62 - Alte Schlachthalle / S13",
		"Gewerbegebiet an der B 95",
		"Hildesheimer Straße 238 / Bernwardstraße",
		"Justus-Liebig-Straße 13+15+17+19",
		"K 12n",
		"Kantstraße 12/Karlstraße",
		"L10, 7",
		"L 199",
		"Leopoldstraße 5 / Ecke Georgenstraße",
		"Mittelstraße (268 234 267)",
		"Ostbredenstraße 73 +",
		"P7, 1",
		"Postfach 15",
		"Rathjenweg 1 u.",
		"Rathjenweg 1 u. 3",
		"Ronsdorfer Straße 2 Garten",
		"Schlosswall 24 (Ecke Rehmstrasse)",
		"Straße des 13. Januar",
		"Alter Weg 110 a", // Deutsches Beispiel der Post
		"Postfach 12 34 56", // Deutsches Postfach
		"8 ALLEE DES LILAS", // Französisch
		"49 Featherstone Street", // Britisch Privatadresse
		"PO Box 123", // Britisches Postfach
		"VIA TOSCANA 9", // Italienische Privatadresse
		"CORSO SEMPIONE 91", // Italienische Firmenadresse
		"Overtoom 74", // Niederländische Privatadresse
		"Postbus 102", // Niederländische Firmenadresse
		"Wiener Hauptstraße 10/A/4/15*", // Österreichische Privatadresse 10 = Hausnummer, A = Wohnblock, 4 = Treppenhaus / Aufgang / Stiege, 15 = Türnummer 
		"Sterzinger Straße 1", // Österreichische Firmanadresse 
		"Krakaudorf 32", // Österreichische Privatadresse wenn es keine Straße im dorf gibt, wird das Dorf als Straßennamen verwendet
		"Hofwisenstrasse 30/5", // Schweizer Privatadresse ( /5 ist die Wohnungsnummer )
		"Berninastrasse 51", // Schweizer Firmenadresse
		"123 MAGNOLIA ST", // Amerikanische Privatadresse
		"P.O. BOX 1234" // Amerikanisches Postfach
	};

@ kAoZ: Die Straßennamen sollen in ein Array gesteckt werden, welches von der Methode zurückgegeben wird.

Beispiel ("Westerende 8a2 - 14b"):

Array[0] = "Westerende";
Array[1] = "8a2";
Array[2] = "14b";

An Array[0] ist dann der Straßennamen wie "Westerende", an Array[1] ist dann die "Von-Zahl" also "8a2" und in Array[2] ist dann die "Bis-Zahl" also "14b".

Ich hoffe ich hab's verständlich erklärt.
 
Auch wenn du die Namen einliest und nicht selber erstellst, solltest du die Straßen trotzdem in einem Objekt speichern und nicht für jede Straße ein Array anlegen.

Zu deinem "eigentlichen Problem": Es wäre hilfreich zu wissen wie du an die Straßennamen kommst (Datenbank? Deine eigene Eingabemaske? - Hier müsstest du diese dann entsprechend anpassen, sodass "vernünftige" getrennte Strings bekommst).

Außerdem wäre es interessant den Verwendungszweck für die aufgeführten Hausnummer-Varianten zu wissen bzw. was dein Programm überhaupt machen soll.

mfg

Aristro 🙂
 
Leider liegen sie in einer Datenbank, zu tausenden. Der Straßenname wurde in solchen Formaten, wie sie in der Liste zu sehen sind, abgespeichert ( war nicht meine Idee ). Und um diese auswerten zu können, brauche ich die Namen in diesem Format:

Array[0] = Straßenname
Array[1] = Hausnummer Von
Array[2] = Hausnummer Bis // falls nicht vorhanden, leer

Somit ist die Eingabemaske leider nicht zu verändern.

[EDIT]Ich hab noch eine kleine Frage:
Undzwar gibt es Straßennamen wie "A 7" oder "An der B199 46" wie bekomm ich es per regex raus ob es noch zum Straßennamen gehört? Hatte gedachte das A und B abzufragen, weiß aber nicht wie.
Also : Wenn ein "A" oder "B" vor der Zahl steht, nehme die Zahl nach der Zahl (gegebenenfalls hinter dem Leerzeichen)

[/EDIT]
 
Zuletzt bearbeitet:
Auch wenn du die Namen einliest und nicht selber erstellst, solltest du die Straßen trotzdem in einem Objekt speichern und nicht für jede Straße ein Array anlegen.

Wenn der TO nur einzelne Strings geliefert bekommt, kann er daraus schlecht Straße-Objekte erstellen ohne vorher die Strings aufzuteilen.. wo wir dann wieder bei der Ausgangsfrage sind.
 
Genau, ich bekomme halt nur einen String ( Die Straße ), dieser soll in 3 Teile "zerbrochen" werden, die ich dann in einem Array zurückgebe.

Ich hab noch eine kleine Frage:
Undzwar gibt es Straßennamen wie "A 7" oder "An der B199 46" wie bekomm ich es per regex raus ob es noch zum Straßennamen gehört? Hatte gedachte das A und B abzufragen, weiß aber nicht wie.
Also : Wenn ein "A" oder "B" vor der Zahl steht, nehme die Zahl nach der Zahl (gegebenenfalls hinter dem Leerzeichen)

Beispiel:

Übergebener String: An der Autobahn A 7 64-68
Array[0] = "An der Autobahn A 7";
Array[1] = "64";
Array[2] = "68";

Ich hoffe ihr wisst, was ich meine. Soll halt nur passieren, wenn ein großen "A" vor der Zahl steht.
 
An der Autobahn A 7 64-68

Das wird recht komplex, du müsstest Wiederum unterscheiden zwischen

Code:
A7
und
Code:
A 7

1. du müsstest prüfen ob auf einen Großbuchstaben eine Ziffer Folgt, da dies in einem Regulären Straßennamen nicht der Fall sein sollte.
2. du müsstest prüfen ob sich zwischen dem Großbuchstaben und der Ziffer ein Leerzeichen befindet

und demnach dafür, insofern möglich eine regex erstellen, da du hier allerdings schon einen haufen Code schreiben musst um diese speziellen fälle zu prüfen wirst du mit einer einfachen regex glaube ich nicht hinkommen.

Ist halt auch die Frage wie soll das ganze später in deinem Array stehen ?

Java:
So
An 
der
Autobahn
A 7
64-68

oder so

Java:
An der Autobahn A 7
64-68

oder doch so

Java:
An der Autobahn
A 7
64-68

oder vielleicht so

Java:
An der Autobahn
A 7
64
68

Ein Postfach , so wie oben in deiner Liste ist eben ein Postfach und keine Straße .....

Und wie verarbeitest du diese Daten dann weiter ?

[EDIT]Und vorallem, was machst du wenn ( übertrieben gesagt ) eine andere Strasse dann vielleicht
Code:
 An dem Autobahnzubringer A395 28b-33c
heißt ? Dazu bräuchtest du wieder eine andere Fallunterscheidung [/EDIT]

du siehst das man sowas nicht immer verallgemeinern kann, schon Garnicht wenn du absolut NULL Einfluss darauf hast wie die namen in der Datenbank hinterlegt werden, hinzu kommt das du ja so wie es oben steht auch noch Postfächer behandeln sollst, und da könnte z.B eine regex die für den einen Fall komplett logisch erscheint , bei einem anderen Fall zu einem völlig Abstrakten Ergebnis, und eben zu vielleicht, schwerwiegenden Fehlern/Exceptions führen ......

[TIPP]Ich für meinen Teil würde vielleicht erstmal schauen , was genau sich alles in der Liste befindet, diese splitten ( Straßen, Postfächer usw. ) und dann mir die speziellen Fallunterschiedungen ansehen und regex / Anweisungen erstellen. [/TIPP]
 
Zuletzt bearbeitet:
Hi - nix löschen - Google hat mich dankensweise auch zu diesem Thread geführt und ich bin auf diese Lösung gekommen:

Code:
           String patternAdresslineSplit = "^([A-Za-zäöüß\\s\\d.,-]+?)\\s*([\\d\\s]+(?:\\s?[-|+/]\\s?\\d+)?\\s*[A-Za-z]?)?";
           Pattern streetPattern = Pattern.compile(patternAdresslineSplit);
           Matcher mStreet = streetPattern.matcher(adressline);
           StreetObject streetObject = null;
           if (mStreet.matches())
           {
               if (mStreet.groupCount() == 2)
               {
                   String street = mStreet.group(1);
                   String houseNumber = mStreet.group(2);
               }
           }

Vielleicht nicht die eleganteste Lösung, für meine Zwecke hat sie jedoch gut funktioniert!
Viele Grüße
Matthias
 
Ich habe das auch mal Lösen müssen und mein Fazit ist das Straßennamen mit Hausnummern echt bescheuert sind 😀

Aber ich hab eine Lösung gefunden die bis jetzt ganz gut geklappt hat:
Vorab noch: Ich hab einen String bekommen in dem Straßennamen und Hausnummer in einem steht. Z.B. "Zum Roth 14b"
Zuerst hab ich die letzte Zahl in dem String gesucht, bin dann von dort Rekursiv richtung anfang gelaufen bis zum ersten Leerzeichen. Alles was dann vor dem Leerzeichen kommt ist für mich die Straße und alles danach die Hausnummer.
 

Zurück
Oben