Computerhilfen.de Logo
Forum
Tipps
News
Frage stellen

Java - Regular Expressions-Problem

Hülfe ich komm nicht klar  ;)

Ich habe in einer jsp ein Eingabefeld. Der hier eingegebene String muss immer im Format "XXXX00" vorliegen - wobei X ein Buchstabe und 0 eine Zahl ist. (also erst 4 Buchstaben, dann 2 Zahlen.)

Zur Validierung des ganzen wollte ich die matches-Methode der String-Klasse nutzen.
Hierbei zerlege ich den String erstmal mittels Substring in zwei Teile was auch super funktioniert, allerdings bekomm ich die Angabe der "Regular Expression" nicht auf die Reihe.

Nutzen wollte ich:

[a-zA-Z] - a through z  or A through Z, inclusive (range)
und
\d - A digit: [0-9]

gemäß
http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html#sum

hier mal die komplette Methode (die eine Fehlermeldung ausgeben soll, bei ungültiger Eingabe):

protected ActionErrors validateSixLetterField (String fieldName, String value, boolean checkNull, String format, int length, DomainValue.Factory factory, ActionErrors errors)

//Hier wird eigentlich noch eine andere Methode aufgerufen, deswegen die ganzen Übergabeparameter oben!

//Hier die Fehlehafte Stelle:
{
if(value != null && !value.substring(0,4).matches("[a-zA-Z]") || !value.substring(4,6).matches("\\d"))
  {
   errors.add("",new ActionMessage("error.invalidSixLetter", fieldName, value));
  }
  return errors;
}

Als Ergebnis bekomme ich jedesmal die von mir generierte Fehlermeldung, auch wenn die Eingabe eigentlich passen sollte. Habs auch einzeln getestet, weder .matches("[a-zA-Z]") noch .matches("\\d") funktioniert.
Nur "\d" gibt übrigens sofort nen Compilerfehler!

Hat irgendjemand ne Ahnung, wie die Expressions da zu nutzen sind?

 

Antworten zu Java - Regular Expressions-Problem:

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Hi |

Kanns grad leider nich vollständig ausprobieren aus Zeitmangel. Aber nur soviel: [a-zA-Z] gibt meines Wissen EIN beliebiges Zeichen von a bis z (groß oder klein) an. Da du 4 Zeichen zum Prüfen schickst, kommt der Fehler. Du müsstest der RegExp noch sagen, wie oft das Zeichen vorkommen soll. Funzen könnte: [a-zA-Z]{4}  ...wie gesagt, nicht getestet.

Viel Erfolg!

greez 8)
JoSsiF

Kleiner Programmtipp:
http://weitz.de/regex-coach/
Das beste Tool zum Testen von regulären Ausdrücken, was ich kenne.

Du musst das nicht erst zerlegen. Du kannst direkt sagen: 4 Buchstaben, gefolgt von 2 Ziffern.
Zu beachten ist, dass Du je nach Programmiersprache die Dinger erst escapen musst, daher wahrscheinlich \\d statt \d (Vermutung).

Mit dem Tool kommt man schnell zu Ziel und man lernt dabei noch was.

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Aha, nur EIN Zeichen, da lag der Hund begraben...

Also bei mir funktionierts jetzt wie folgt:

if(value != null && !value.substring(0,4).matches("[a-zA-Z]*")|| !value.substring(4,6).matches("\\d*"))
{
  ...
}

...also, da der String ja schon zerlegt wurde, reichte ein einfaches "*" als Platzhalter, um den kompletten Substring zu prüfen.
Und "\\d" muss es auch heißen (also mit vorangestelltem Escape-Zeichen).

@JoSsiF
Die sache mit "{AnzahlZeichen}" hab ich jetzt auch nicht getestet, werd ich aber mal im Hinterkopf fürs nächste mal behalten (Dann muss man den ursprünglichen String u.U. gar nicht mittels .subString() zerlegen !?!)

@Cruncher
Werd mir das Tool mal inner ruhigen Minute genauer anschauen...

THX, euch beiden!
 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Die sache mit "{AnzahlZeichen}" hab ich jetzt auch nicht getestet, werd ich aber mal im Hinterkopf fürs nächste mal behalten (Dann muss man den ursprünglichen String u.U. gar nicht mittels .subString() zerlegen !?!)

Richtig, das musst du nicht zwingend. Denn mit einem regulären Ausdruck gibst du ja ein Muster an. Und ein Muster kann auch sein, dass erst 4 Buchstaben und dann 2 Zahlen kommen ;)

Die Variante mit "*" ist nicht geeignet, sofern die Anzahl der Zeichen vorgeschrieben ist. Wenn du also sichergehen willst, ob es genau 4 Buchstaben sind, dann kannst du das auch wie beschrieben tun.

greez 8)
JoSsiF

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Die Variante mit "*" ist nicht geeignet, sofern...

Jupp, da ich mir aber mittels substring(0,4) exakt die ersten 4 Zeichen hole, funzt es in dem Fall wieder!

Die Länge des gesamten Strings (in dem Fall 6) wird übrigens schon vorher geprüft, hatte ich nur nicht mit angegeben.
Die Variante ohne vorherige Zerlegung werd ich beim nächsten mal testen, jetzt reichts mir aber so.

mfg
tremor4fun
 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Nachtrag (der Vollständigkeit halber)  ;)

String im gewünschten Format (4 Buchstaben gefolgt von 2 Ziffern):

String value = "abcd01"

geprüft mit:
value.matches("[a-zA-Z]{4}\\d{2}");

funzt bestens und somit kann die Zerlegung mittels Substring entfallen.

mfg
tremor4fun
   

« JAVA palaava...Java Applet "Ping-Pong"<<Problem im Anfangsstadium mit KeyListener und Thread>&a »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
Eingabefelder
Als Eingabefelder werden in einem Programm oder in Online-Formularen die Stellen bezeichnet, an denen Informationen eingetippt werden können. Die Beschriftung neben ...

Bitmap Format
Das Windows-Bitmapformat ist das Standard - Grafikformat, auch Rastergrafik genannt, von Windows Microsoft. In dem Bitmapformat existiert auch das Startlogo von Windows, ...

Formatieren
  Das Formatieren einer Festplatte, HDD oder SSD bereitet das Laufwerk auf neue Daten vor. Dazu werden sämtliche alten Daten gelöscht, damit die...