Java Look-Ahead/-Behind-Regex funktioniert mit Pattern nicht wie erwartet

mental.dIseASe

Lieutenant
Registriert
Dez. 2008
Beiträge
671
Guten Abend,

mich plagt das folgende Problem:

Code:
Pattern.compile("[a-zA-Z(?!s)]*").matcher("AAas").matches()

dort kommt merkwürdigerweise true zurück. So wie ich Look-Ahead verstanden habe, sollte dieser Ausdruck eigentlich folgendes akzeptieren:

Folgen von Klein- und Großbuchstaben, wobei nach keinem Buchstabe ein kleines "s" kommen darf. Im Beispiel ist aber ein s enthalten und folgt daher auf einen Klein- oder Großbuchstaben. Deswegen sollte (laut meiner Intuition) dort eigentlich false zurückkommen.

Genauso merkwürdig finde ich das folgende:

Code:
Pattern.compile("[A-Z(?!s)]*").matcher("A").replaceAll("&")

Dort kommt "&&" zurück, obwohl der String, gegen den gecheckt wird, eine Länge von 1 hat. Kann mir das jemand erklären? Wird hier etwa der Leerstring wegen dem Sternchen noch als Match erkannt?! Ich weiß schon, wieso ich sonst solche Sachen immer an einen Kollegen delegiere...
 
Moin,

also bei mir funktioniert folgendes:
Code:
Pattern.compile("([A-Z](?!s))+").matcher("AA").replaceAll("&")
-> Gibt "&" aus.
Code:
Pattern.compile("([A-Z](?!s))+").matcher("AA A AAA").replaceAll("&")
-> Gibt "& & &" aus.

Code:
Pattern.compile("([a-zA-Z](?!s))+").matcher("Aas").matches()
-> False
Code:
Pattern.compile("([a-zA-Z](?!s))+").matcher("Aa").matches()
-> True

Edit: Das Sternchen steht für die Kleenesche Hülle, da ist auch das leere Wort enthalten. Das "+" schließt das leere Wort aus, dh. etwas kann zwischen einem und n mal vorkommen. Bei dem zweiten hast du nur die Klammern falsch gesetzt. [] zeigt Alternativen auf, dh. (?!s) darf nicht in den eckigen Klammern stehen.

VG,

Robert
 
Zuletzt bearbeitet:
Hmm, also scheint das wirklich an den jeweiligen Sternchen zu liegen, die du in deinen Expressions nicht hast. Ich glaube, ich hätte damals im Studium besser aufpassen sollen... :(

Ah, ok, danke für den Hinweise mit der Klammersetzung!
 
Ich habe die Sternchen gegen Plus-Zeichen ausgetauscht.

* = 0 bis n mal.
+ = 1 bis n mal.

Edit: Die Klammersetzung sollte man logischerweise auch beim ersten Beispiel ändern, ich editier das mal.
 
Ich bin ein wenig irritiert, dass das Beispiel

Code:
Pattern.compile("([a-zA-Z](?!s))+").matcher("Aas").matches()


False zurückgibt. In Worte gefasst bedeutet dieses Pattern doch "1 bis N Buchstaben, denen kein s folgt". Das trifft doch auf das A und das s in dem String zu. Nun bin ich kein Java-Programmierer, daher frage ich mich: Prüft dieser Aufruf ob der gesamte String zutrifft und nicht nur ein Teil? Quasi das Äquivalent zu ^ am Anfang und $ am Ende des Patterns?
 

Ähnliche Themen

M
Antworten
6
Aufrufe
1.080
Mr. Snoot
M
Zurück
Oben