# Zahl aus String (Buchstaben und Zahl) extrahieren



## _Fox_ (14. Jan 2005)

Hallo,

ich hab einen String, in dem steht Straße und Hausnummer. Ich benötige die Hausnummer. Theoretisch müsste ich noch berücksichtigen, das nach der Hausnummer noch ein Buchstabe kommen kann, z.B. 15b.

Wer hat 'ne Idee?


----------



## Beni (14. Jan 2005)

Finde heraus, von wo bis wo Zeichen wie "1", "2", ... stehen, und betrachte nur diesen Substring...


----------



## atarifreak (14. Jan 2005)

Ich würde von rechts nach dem ersten Vorhandensein eines Leerzeichens oder Punktes suchen und den Teil des Strings dann extrahieren bzw. teilen. Vorher wird er natürlich Am Anfang und Ende leerzeichenbereinigt.


----------



## atarifreak (14. Jan 2005)

Beni hat gesagt.:
			
		

> Finde heraus, von wo bis wo Zeichen wie "1", "2", ... stehen, und betrachte nur diesen Substring...



Das haut nicht hin, wenn er die Buchstaben der Hausnummer mit drin haben möchte.


----------



## Beni (14. Jan 2005)

Hm, ja, das war eine Fehlüberlegung von mir :-/


----------



## atarifreak (14. Jan 2005)

Vielleicht etwa so:


```
int trennstelle = string.lastIndexOf(' ');
String strasse = string.substring(trennstelle, string.length()-trennstelle);
String nummer = string.substring(0, trennstelle - 1);
```

Habs nicht ausprobiert, kann sein, dass Du bei der Strasse noch etwas mit der Trennstelle um -1 springen mußt.

AF


----------



## _FOX_ (14. Jan 2005)

atarifreak hat gesagt.:
			
		

> Ich würde von rechts nach dem ersten Vorhandensein eines Leerzeichens oder Punktes suchen und den Teil des Strings dann extrahieren bzw. teilen. Vorher wird er natürlich Am Anfang und Ende leerzeichenbereinigt.




Was ist wenn die Hausnummer nicht "15b" ist, sondern "15 b", also mit Leerzeichen? Dann dürfte das auch nicht funktionieren.


----------



## atarifreak (14. Jan 2005)

_FOX_ hat gesagt.:
			
		

> Was ist wenn die Hausnummer nicht "15b" ist, sondern "15 b", also mit Leerzeichen? Dann dürfte das auch nicht funktionieren.



Dann prüfst Du, wieder von rechts, ob das nächste Zeichen, was links kommt, eine Zahl oder ein Buchstabe ist. Ist es eine Zahl, dann gehört es zur Nummer, ist es ein Buchstabe, ist es eine Strasse.


----------



## mic_checker (14. Jan 2005)

atarifreak: Dein Code funzt so auch net.

Zum einen heisst es:


```
string.length()
```

anstatt


```
string.length
```

Hast das Prog mal getestet? Bei mir hats nicht gefunzt....Überleg mir mal was anderes

ps.
wäre es nicht besser im Beispiel mit nem Test-String zu arbeiten, die Bezeichnung string ist vielleicht irreführend


----------



## atarifreak (14. Jan 2005)

Eine andere Möglichkeit wäre, dass Du aus dem String komplett von Links nach Rechts durchläufst. Ab der ersten Zahl, die gefunden wird, ist es eine Hausnummer.


----------



## atarifreak (14. Jan 2005)

mic_checker hat gesagt.:
			
		

> atarifreak: Dein Code funzt so auch net.



Hab doch gesagt, dass ich den Code nicht getestet habe. War nur ein Gedankenanstoß. Ok, wollte jetzt eigentlich Feierabend machen, aber gut ... momentchen ...  :wink:


----------



## _Fox_ (14. Jan 2005)

atarifreak hat gesagt.:
			
		

> Eine andere Möglichkeit wäre, dass Du aus dem String komplett von Links nach Rechts durchläufst. Ab der ersten Zahl, die gefunden wird, ist es eine Hausnummer.



Und was ist wenn die Straße so heißt: "Straße des 16. August"?


----------



## mic_checker (14. Jan 2005)

Du könntest den String ja auch mit StringTokenizer zerlegen.

Falls der StringTokenizer das ganze in 3 Teilstrings zerlegt wurde es so angegeben:

<Straßenname> <Straßennummer> <Buchstabe>

Falls 2:

<Straßenname> <Straßennummer [Buchstabe]>

Der erste Teilstring entspricht dann dem Straßennamen, im zweiten musst du lediglich gucken ob der String Buchstaben enthält.


----------



## mic_checker (14. Jan 2005)

Für eine solche Möglichkeit müsstest du die Behandlung der StringTokenizer etwas flexibler gestalten,  aber ist nicht viel schwerer. Kannst ja die Teilstrings wieder überprüfen (ob Zahlen , Buchstaben etc. enthalten).



> Und was ist wenn die Straße so heißt: "Straße des 16. August"?


Soll dann da als Hausnummer 16 rauskommen? Ich schätze mal die ganze Straße heisst so, als Hausnummer kann dann ja immer noch was dahinter kommen...oder?


----------



## atarifreak (14. Jan 2005)

_Fox_ hat gesagt.:
			
		

> Und was ist wenn die Straße so heißt: "Straße des 16. August"?



Das sieht dann schlecht aus und schreit ja schon fast nach einen vorhandenen Strassenverzeichnis, mit dem man das vergleichen kann.  :? 

Also hier mein Beispiel:


```
public static void main(String[] args)
	{
		String sAdresse = "Manfred-Hippe-Str. 24a";
		String sStrasse = "";
		String sNummer = "";
		int iPos = sAdresse.indexOf(' ');
		sStrasse = sAdresse.substring(0, iPos).trim();
		sNummer = sAdresse.substring(iPos, sAdresse.length()).trim();
		
		System.out.println("Strasse:" + sStrasse + "\nNummer:" + sNummer);
	}
```

Damit geht es zumindest für herkömmliche Strassen.  :wink:


----------



## mic_checker (14. Jan 2005)

atarifreak hat gesagt.:
			
		

> _Fox_ hat gesagt.:
> 
> 
> 
> ...


Ich würd sagen: Selber schuld wenn man in so ner komischen Straße wohnt :lol:



> Also hier mein Beispiel:
> 
> 
> ```
> ...



herkömmlich != straßenname bestehend aus zwei wörtern ? *G*

Zumindest funktioniert es für den Fall nicht.


----------



## Dreezard (14. Jan 2005)

Also ich würde es schon so ähnlich machen. Erstmal gucken, wo die LETZTE Zahl steht. Dann gucken, wie viele Zeichen noch folgen. Wenn gleich oder weniger 2 ist es ein gewöhnlicher straßenname und kann ab der ersten vorkommenden Zahl extrahiert werden. Wenn mehr als zwei Zeichen Folgen, dann ist es eh Fragwürdig ob die Zahl extrahiert werden sollte. Man könnte aber auch da mit versch. überprüfungen die Hausnummer (mit Buchstaben) extrahieren


----------



## mic_checker (14. Jan 2005)

Dreezard hat gesagt.:
			
		

> Wenn mehr als zwei Zeichen Folgen, dann ist es eh Fragwürdig ob die Zahl extrahiert werden sollte.


Bei der Entwicklung eines Algorithmus zur Lösung eines best. Problems, ist eine wesentliche Eigenschaft:

- Eindeutigkeit

Da passt "Fragwürdigkeit" nicht gerade gut zu....

Vielleicht sollte man erst ein allgemeines Schema über den allgemeinen Aufbau eines Straßennamens etc. "entwickeln".


----------

