# Adresse und Hausnummer mit regular expression



## MaximaxXx (2. Juli 2013)

Hallo zusammen,

ich stehe vor einem kleinen Problem.

Wir erfassen derzeit die Straße und Hausnummer in einem Feld. Dieser Umstand ist auch nicht veränderbar, da hier Aspkete des ERP System einspielen.

Jedoch benötige ich nun eine zuverlässige Möglichkeit um Straße und Hausnummer von einander zu trennen.

Hintergrund: Für die ERP Auftragsbearbeitung müssen Straße und Hausnummer in einem Feld erfasst werden, User Accounts hingegen besitzen 2 getrennte Felder.

Wichtig wäre dabei natürlich, dass unsere unterschiedlichsten deutschen Adressen zuverlässig klappen.

```
Straße 15
```
 sollte genauso gut funktionieren wie 
	
	
	



```
Straße des 17. Juni 12/c
```

Ich konnte bisher leider kein Java Ergebnis finden.

Grüße

Max


----------



## Der Wolf (2. Juli 2013)

Hallo,

wenn bei den Eingaben der letzte Block immer die Hausnummer ist, und dieser Block immer zusammenhängt - also nicht "12 a" als Hausnummer sondern "12a" - dann könntest du über einen regulären Ausdruck die Zeile in 2 Teile zerlegen lassen: Anfang und letzer Block.

Was auch möglich wäre: Den String über split and den Leerzeichen trennen und dann das letzte Token als Hausnummer verwenden.

Gruß,
Wolf


----------



## diel2001 (2. Juli 2013)

Das geht ganz einfach per Regex: 

http://www.google.de/url?sa=t&rct=j...=5JmZcdkd_xr-ZYwbkghIJA&bvm=bv.48705608,d.Yms

http://www.vogella.com/articles/JavaRegularExpressions/article.html


----------



## MaximaxXx (2. Juli 2013)

Das sind gute Beispiele, jedoch bin ich wenig Fit in Regex und kann daraus leider nicht lesen was ich suche.



diel2001 hat gesagt.:


> Das geht ganz einfach per Regex:
> 
> http://www.google.de/url?sa=t&rct=j...=5JmZcdkd_xr-ZYwbkghIJA&bvm=bv.48705608,d.Yms
> 
> http://www.vogella.com/articles/JavaRegularExpressions/article.html


----------



## diel2001 (2. Juli 2013)

```
Pattern pattern = Pattern.compile("(\\w+)\\s(\\d+)"); \\w+=1 oder mehr Wortzeichen ([a-zA-Z]),\\d+=1 oder mehr  Ziffern, \\s = ein leerzeichen
    Matcher matcher = pattern.matcher("Straße 15");
    if(matcher.find()){
      System.out.println(matcher.group(1)); //Straße
      System.out.println(matcher.group(2)); // Hausnummer
    }
```

Bitte schön


----------



## MaximaxXx (2. Juli 2013)

Hi diel2001,

als Ergebnis meines Beispiels "straße des 17. Juni 12/c" bekomme ich nun


```
public static void main(String[] args) {
		String data = "Name der 18 Strase 25/5";
		Pattern pattern = Pattern.compile("(\\w+)\\s(\\d+)"); 
		//\\w+=1 oder mehr Wortzeichen ([a-zA-Z]),\\d+=1 oder mehr  Ziffern, \\s = ein leerzeichen
			    Matcher matcher = pattern.matcher("Straße des 17. Juni 12/c");
			    if(matcher.find()){
			      System.out.println(matcher.group(1)); //Straße
			      System.out.println(matcher.group(2)); // Hausnummer
			    }

	}
```


```
des
17
```





diel2001 hat gesagt.:


> ```
> Pattern pattern = Pattern.compile("(\\w+)\\s(\\d+)"); \\w+=1 oder mehr Wortzeichen ([a-zA-Z]),\\d+=1 oder mehr  Ziffern, \\s = ein leerzeichen
> Matcher matcher = pattern.matcher("Straße 15");
> if(matcher.find()){
> ...


----------



## Der Wolf (2. Juli 2013)

Das klappt für das Beispiel mit "Strasse 15", aber was ist bei komplizierteren Strassennamen wie "Straße des 17. Juni 12/c"? Da wird der Ausdruck wohl nicht mehr funktionieren.

Gruß,
Wolf


----------



## diel2001 (2. Juli 2013)

Was ist das denn für ein komischer Straßename? Eine Straße mit Datum ?


----------



## Der Wolf (2. Juli 2013)

Selbst ohne das Datum dürfte der reguläre Ausdruck mit zum Beispiel "Carl-Friedrich-Gustav Str. 7a" Probleme haben, denke ich mal.


----------



## MaximaxXx (2. Juli 2013)

Es gibt viele verrückte Straßennamen in Deutschland 



diel2001 hat gesagt.:


> Was ist das denn für ein komischer Straßename? Eine Straße mit Datum ?


----------



## MaximaxXx (2. Juli 2013)

Genau!

Ich werde wohl eine andere Lösung finden müssen.


Der Wolf hat gesagt.:


> Selbst ohne das Datum dürfte der reguläre Ausdruck mit zum Beispiel "Carl-Friedrich-Gustav Str. 7a" Probleme haben, denke ich mal.


----------



## Der Wolf (2. Juli 2013)

Kannst du den String nicht, wie ich im ersten Post geschrieben habe, anhand seiner Leerzeichen zerlegen? Das letzte Token ist die Hausnummer, alle anderen davor ergeben den Strassennamen. Das sollte eine ziemlich einfache Lösung sein. Bringt natürlich Probleme, falls es Addressen wie "Carl-Friedrich-Gustav Str. 7 a" gibt.


----------



## diel2001 (2. Juli 2013)

```
Pattern pattern = Pattern.compile("((\\w+)\\s?)+\\s+(\\d+.*)^"); \\w+=1 oder mehr Wortzeichen ([a-zA-Z]),\\d+=1 oder mehr  Ziffern, \\s = ein leerzeichen
    Matcher matcher = pattern.matcher("Straße 15");
    if(matcher.find()){
      System.out.println(matcher.group(2)); //Straße
      System.out.println(matcher.group(3)); // Hausnummer
    }
```


So vielleicht ? Ich konnte das aber jetzt nicht testen.


----------



## MaximaxXx (2. Juli 2013)

Funktioniert gar nicht. Kein Ergebnis, dennoch Danke




diel2001 hat gesagt.:


> ```
> Pattern pattern = Pattern.compile("((\\w+)\\s?)+\\s+(\\d+.*)^"); \\w+=1 oder mehr Wortzeichen ([a-zA-Z]),\\d+=1 oder mehr  Ziffern, \\s = ein leerzeichen
> Matcher matcher = pattern.matcher("Straße 15");
> if(matcher.find()){
> ...


----------



## MaximaxXx (2. Juli 2013)

Die Problematik dieser Lösung hast du ja bereits erwähnt 


Der Wolf hat gesagt.:


> Kannst du den String nicht, wie ich im ersten Post geschrieben habe, anhand seiner Leerzeichen zerlegen? Das letzte Token ist die Hausnummer, alle anderen davor ergeben den Strassennamen. Das sollte eine ziemlich einfache Lösung sein. Bringt natürlich Probleme, falls es Addressen wie "Carl-Friedrich-Gustav Str. 7 a" gibt.


----------



## MaximaxXx (3. Juli 2013)

Habe das nun so gelöst, dass das Frontend zunächst die Daten in getrennten Feldern abfragt und vor der Übergabe an das ERP System das Ganze wieder zu einem Feld zusammenzieht.

Danke für die Ideen.


----------



## tombe (3. Juli 2013)

```
Straße des 17. Juni 12/c

Hauptstrasse 22-1

Blümchenweg 3

Stuttgarter Strasse 22 - 24 A
```

Ohne das ich jetzt ein funktionierendes Beispiel hätte, nur so eine Idee.

Wenn du nun den String von hinten nach der ersten Zahl durchsuchst auf die ein Leerzeichen und dann ein beliebiger *Buchstabe* folgt, dann bekommst du für die obigen Beispiele die Werte


```
12/c

22-1

3

22 - 24 A
```

zurück. Oder täusche ich mich da?

*NACHTRAG:*
Auch wenn das hier das Java Forum ist, poste ich trotzdem mal eine Lösung wie ich se mit PHP gemacht habe. Den regulären Ausdruck kannst du ja vielleicht trotzdem anwenden.


```
<?php

$strassen = array("Straße des 17. Juni 12/c", "Hauptstrasse 22-1", "Blümchenweg 3", "Stuttgarter Strasse 22 - 24 A");
$muster = " [0-9]{1,5}[/ \- 0-9 a-z A-Z]*";

for ($a = 0; $a < count($strassen); $a++) {
	preg_match_all("! [0-9]{1,5}[/ \- 0-9 a-z A-Z]*!m", $strassen[$a], $matches, PREG_SET_ORDER);
	var_dump($matches);
	echo "<hr />";
}

?>
```

Damit bekomme ich als Ergebnis dann:


```
array(2) { [0] => array(1) { [0] => string(3) " 17" } [1] => array(1) { [0] => string(5) " 12/c" } } 
--------------------------------------------------------------------------------
array(1) { [0] => array(1) { [0] => string(5) " 22-1" } } 
--------------------------------------------------------------------------------
array(1) { [0] => array(1) { [0] => string(2) " 3" } } 
--------------------------------------------------------------------------------
array(1) { [0] => array(1) { [0] => string(10) " 22 - 24 A" } }
```


----------



## takidoso (4. Juli 2013)

Hallo allesamt,
vielleicht mal ganz unabhängig von Syntax kann das Problem vielleicht so gelöst werden:

- Suche die letzten zusammenhängenden Ziffern 
- Nehme diese Ziffern inklusive Rest des Strings

So wäre das Beispiel mit der Hausnummer inklusive Buchstabe jedoch mit witespace dazwischen (s.o. "7 a" anstelle 7a) ebenso drinn, oder?

VG

Takidoso


----------



## Der Wolf (4. Juli 2013)

Hallo takidoso,

ja, das müsste auch funktionieren. Hatte tombe aber vor dir schon vorgeschlagen. 

Gruß,
Wolf


----------



## MaximaxXx (8. Juli 2013)

Okay das sieht richtig gut aus. Kann jemand die Regex in Java?!


----------

