Stringmanipulation

Status
Nicht offen für weitere Antworten.

jack26

Mitglied
Hallo,

ich möchte an eine Funktion, welche einen char-Wert zurückgeben muss einen String übergeben,
Er darf nur Zahlen von 0 bis 9,
Leerzeichen und
Trennstriche ("-") enthalten

Außerdem dürfen nicht mehr als insgesamt 9 Ziffern darin vorkommen.

Falls eines davon nicht der Fall ist, sollte ein Fragezeichen ("?") zurückgegeben werden.
Ansonsten gibt sie irgendeinen anderen Buchstaben zurück.


Ich hab da jetzt schon lange rumprobiert, komme nur auf keine Lösung die Funktioniert.
Wäre nett, wenn mir jemand Helfen könnte.

Danke
Gruß
 

Backwardsman

Bekanntes Mitglied
warum gleich mit kanonen auf spatzen schießen? ... was hast du bis jetzt denn dazu gecoded? im grunde musst du nur den string zeichen für zeichen durchgehen und falls ein zeichen nicht deinen anforderungen entspricht, brichst du die suche ab und gibst ein "?" aus, mehr als zusätzlich noch die ziffern zählen ist es eigentlich nicht!
 

function

Bekanntes Mitglied
also ich würde sagen regex is die bessere alternative, damit handelt man das ganze in einer codezeile ab, anstatt die prüfung selbst zu schreiben...
 

Backwardsman

Bekanntes Mitglied
tja, wenn man sich mit regulären ausdrücken allerdings nicht gut auskennt, halte ich das für gefährlicher, als selbst zu prüfen, gerade wenn es sich um so eine einfach prüfung handelt.
 

lhein

Top Contributor
@HoaX:

Code:
System.out.println("123456789a".matches("(\\d -){1,9}"));    
System.out.println("1- 345678".matches("(\\d -){1,9}"));
System.out.println("1- 2345678".matches("(\\d -){1,9}"));

Probiers mal aus. Wenn Du was anderes als 3x false bekommst, dann wär ich überrascht :)

lr
 

function

Bekanntes Mitglied
Backwardsman hat gesagt.:
... soviel zum thema, wie toll und einfach regex ist ;-)
Naja wenn man sich mal öfter mit Eingaben von Benutzern rumschlägt, was ja in der Programmierung sogut wie immer der Fall ist wird man nicht um RegEx herum kommen und wenn man das einmal grundsätzlich begriffen hat ist das auch easy.
 

lhein

Top Contributor
function hat gesagt.:
man setze statt(\\d -) [\\d -]* und schon klappts

wäre [\\d\\s-]*{1,9} nicht richtiger?

lr

EDIT: Seh ich das richtig, daß die {1,9} für die Längenprüfung sein soll? Wenn ja, dann funktioniert es nicht.
 
G

Guest

Gast
LR hat gesagt.:
function hat gesagt.:
man setze statt(\\d -) [\\d -]* und schon klappts

wäre [\\d\\s-]*{1,9} nicht richtiger?

lr

EDIT: Seh ich das richtig, daß die {1,9} für die Längenprüfung sein soll? Wenn ja, dann funktioniert es nicht.

Der Stern bei dir macht die Längenprüfung zunichte, da der Stern heißt, die Zeichen in der eckigen Klammer beliebig oft oder oder gar nicht und die Prüfung dahinter dann nicht mehr stimmt.

Richtig sollte sein:

String#matches("[0-9 -]{1,9}");
 

jack26

Mitglied
Ich danke euch für die zahlreichen Antworten.

Ich konnte mein Problem mit folgender Zeile lösen:

isbn.matches(("[0-9 -]*");

Vielen Dank nochmal.
Gruß
 

lhein

Top Contributor
Anonymous hat gesagt.:
Der Stern bei dir macht die Längenprüfung zunichte, da der Stern heißt, die Zeichen in der eckigen Klammer beliebig oft oder oder gar nicht und die Prüfung dahinter dann nicht mehr stimmt.

Richtig sollte sein:

String#matches("[0-9 -]{1,9}");

Aha, bin kein RegExp Experte. Finde das ganze nach wie vor kryptisch, aber natürlich auch nützlich :)
Danke für die Aufklärung.


@jack26:
:autsch:
Und was machst jetzt mit der Längenprüfung? Egal? Oder machst jetzt noch nen zusätzliches isbn.length?

lr
 
G

Guest

Gast
jack26 hat gesagt.:
Ich danke euch für die zahlreichen Antworten.

Ich konnte mein Problem mit folgender Zeile lösen:

isbn.matches(("[0-9 -]*");

Vielen Dank nochmal.
Gruß

Die Prüfung lässt folgendes zu (evtl. sogar noch mehr):

1. Strings die nur aus Leerzeichen bestehen
2. Strings mit weniger als 9 Zeichen
3. Strings mit mehr als 9 Zeichen
4. Strings die nur aus - bestehen

Wenn du einen String mit maximal 9 Zeichen willst musst du statt dem * schreiben {0,9} oder wenn einen String mit genau 9 Zeichen willst musst du statt dem Stern schreiben {9}.

Wenn du eine ISBN-Nummer prüfen willst (vermute ich jetzt mal weil dein String isbn heißt) kannst du das auch ganz genau prüfen.

Beispiel für ISBN-13 (neue alte Version ist ISBN-10 kann aber analog dazu gemacht werden):

Code:
// Bsp. für ISBN: 978-3-86680-192-9
if (isbn.matches("[0-9]{3}-[0-9]-[0-9]{5}-[0-9]{3}-[0-9]")) {
}

Erklärung:

1. Fängt an mit 3 Zahlen -> [0-9]{3}
2. Dann Bindestrich -> -
3. 1 Zahl -> [0-9]
4. Bindestrich -> -
5. 5 Zahlen -> [0-9]{5}
6. Bindestrich -> -
7. 3 Zahlen -> [0-9]{3}
8. Bindestrich -> -
9. 1 Zahl -> [0-9]

Statt [0-9] jedes mal könntest du dann auch schreiben \\d.
 

jack26

Mitglied
Das mit der Längenüberprüfung hatte etwas tücken, da der String ja theoretisch beliebig lang sein kann, da ja soviele Leerzeichen und Bindestriche darin vorkommen können wie man will. Es soll ja nur getestet werden, ob genau 9 Zahlen darin enthalten sind.

Hab das dann einfach selbst gecodet:
Code:
...
char[] array = isbn.toCharArray();;
				
		for(int i=0; i<isbn.length();i++)
			for(int j=0; j<=9; j++) 
				if(digitToInteger(array[i])==j) 
					counter++;	
...
Hab mir halt dann noch die Methode digitalToInteger() selbst geschrieben:
Code:
public static int digitToInteger(char digit) {
		
		return digit-48;
Später frag ich dann mit folgender Zeile ab, ob der String in Ordnung ist und ausgewertet werden kann:
Code:
if(isbn.matches(("[0-9 -]*"))&& counter==9) 
...

Vielen Dank euch nochmal.

Gruß
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben