Forum: PC-Programmierung Problem mit den Java Regex


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von RateFuchs (Gast)


Lesenswert?

Hallo Leute,

Ich habe da mal eine Frage.. Ich bin kein absoluter Neuling in der Java 
Programmieren habe es jetzt schon ein Semester während meines Studiums.

Leider bekomme ich für einen Bericht folgendes Konstrukt nicht voll 
ständig entschlüsselt.

string.matches("[A-Za-z0-9\\ $\\%()\\-\\.\\/\\?^]*")

Also es sagt mir ja das Groß- und Kleinbuchstaben 0-9 in dem String 
erlaubt ist.
Aber was sagt mir nun die Zeichenfolge nach der 9 könnte mir die mal 
eben jemand aufschlüsseln? Mit der Bedeutung der einzelnen Zeichen. Und 
ja ich habe in den JavaDocs nach geschaut nur Leider komme ich nicht 
weiter. Ich glaube ich habe irgendwo einen Denkfehler.

Vielen Dank für eure Hilfe.

Mit freundliche Grüßen
RateFuchs

von Achim H. (anymouse)


Lesenswert?

RateFuchs schrieb:
> Und
> ja ich habe in den JavaDocs nach geschaut nur Leider komme ich nicht
> weiter. Ich glaube ich habe irgendwo einen Denkfehler.

Diese Seite: 
https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

und der Text (von der gleichen Seite)

"It is therefore necessary to double backslashes in string literals that 
represent regular expressions to protect them from interpretation by the 
Java bytecode compiler. The string literal "\b", for example, matches a 
single backspace character when interpreted as a regular expression, 
while "\\b" matches a word boundary. The string literal "\(hello\)" is 
illegal and leads to a compile-time error; in order to match the string 
(hello) the string literal "\\(hello\\)" must be used."

sollten eigentlich ausreichen.

: Bearbeitet durch User
von Daniel A. (daniel-a)


Lesenswert?

Die Zeichenkette "[A-Za-z0-9\\ $\\%()\\-\\.\\/\\?^]*" entspricht bei 
Javas match funktion folgendem Regexp: /^[A-Za-z0-9\ $\%()\-\.\/\?^]*$/

Der String darf nur aus folgenden Zeichen bestehen:
1
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijplmnopqrstuvwxyz012345689 $%()-./?^

PS: Umlaute sind auch Buchstaben, sind aber nicht im Regexp enthalten.

von Achim H. (anymouse)


Lesenswert?

P.S.: Statt "0-9\\ $\\%" sollte es wohl eigentlich "0-9\\$\\%" heißen, 
das Leerzeichen kommt mir falsch vor.

von S R (Gast)


Lesenswert?

regexpal.com

Hilft dir vielleicht das bildlich zu verstehen.

von RateFuchs (Gast)


Lesenswert?

Vielen Lieben Dank.

Hatte so was ähnliches mit dem 2. \ erwartet danke für die Hilfe

von Jay (Gast)


Lesenswert?

RateFuchs schrieb:
> Hallo Leute,
>
> Ich habe da mal eine Frage.. Ich bin kein absoluter Neuling in der Java
> Programmieren habe es jetzt schon ein Semester während meines Studiums.

Ein Jahr? So ein bisschen im Studium? Du bist noch Neuling.

> string.matches("[A-Za-z0-9\\ $\\%()\\-\\.\\/\\?^]*")

Ein im Kern etwas wild mit Quoting versehene

     Zeichenklasse "[...]",

die Null mal bis beliebig oft:

     *

auftreten darf.

Der ursprüngliche Autor hat es dabei mit dem Quoten von speziellen 
Zeichen etwas übertrieben, er hat wohl so lange \\ reingehauen bis es 
irgendwie lief.

Die Zeichenklasse enthält einfach eine Oder-Verknüpfung aus:

A-Z   - A bis Z
a-z   - a bis z
0-9   - 0 bis 9
      - Lehrzeichen, müsste nicht gequoted werden
        (könnte auch ein anderes Whitespace-Zeichen sein wie ein Tab,
         das wäre dann böser Pfusch).
$     - Muss man hier nicht quoten, hat er auch nicht.
%     - Müsste nicht gequoted werden
(     - Darf man hier nicht quoten, hat er auch nicht.
)     - Darf man hier nicht quoten, hat er auch nicht.
-     - Muss man quoten wenn es an dieser Stelle steht, hat er, kann man
        aber besser machen
.     - Muss man quoten, hat er
/     - Müsste nicht gequoted werden
?     - Müsste nicht gequoted werden
^     - Muss man hier nicht quoten, hat er auch nicht.

Alle "muss", "müsste", "darf" ... unter der Bedingung, dass man die 
einzelnen Zeichen matchen möchte und man sich innerhalb einer 
Zeichenklasse befindet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.