Negation von Pattern bei regex

KhanQQ

Grünschnabel
Hi zusammen,

ich hab ne Frage zu regex.

Ich hätte gern etwas wie String pattern = "irgendwas[^x]+x";

Nur, dass in meinem Fall nicht nur das eine Zeichen x gegeben sein soll, x ein ganzer String ist.

Ich dachte eigentlich, dass es mit (?!x) geht ...aber das scheint nicht zu wollen, oderich mach es einfach falsch:
String pattern = "irgendwas\\(?!dasnicht\\)+dasnicht";

Wäre dankbar für Hilfe

mfg Khan
 
Du darfst die Klammer auch nicht escapen, sonst ist es keine Group mit negative Lookahead sondern er will die Klammern matchen.

Das geht auf jeden Fall:
Java:
public static void main(String[] args) {
	final String pattern = "test(?!hallo).*";
	final String toMatch = "testhalltest2";
	final String noMatch = "testhallotest2";

	final Pattern compile = Pattern.compile(pattern);

	System.out.println(toMatch + ": " + compile.matcher(toMatch).matches());
	System.out.println(noMatch + ": " + compile.matcher(noMatch).matches());
}

Code:
testhalltest2: true
testhallotest2: false
 
Ah, tut mir Leid, dass passiert, wenn man einfach "alte" Anfragen aus nem anderen Forum kopiert. Ich selbst war vom escapen recht schnell wieder weg ^^.

Die Sache ist (?!xxx) heißt, das xxx nicht mehr vorkommt, also gar nicht mehr.
Was ich haben wollte mach ich jetzt glaub mit:

Code:
String pattern = "xxx.*yyy";

Ziemlich simpel und ich hoffe es reicht.
Im Grunde will ich ja nur etwas zwischen zwei Schlüsselworten.
.* müßte reichen, da es ja völlig egal ist, um welche Zeichenkette es sich handelt, solange nur das "Abschlußschlüsselwort" am Ende noch drin ist.

Mal sehen, ob es wirklich so einfach ist.

Und ich zerbrech mir da den Kopf, wie es wohl gehen könnte Oo.

Danke für die Hilfe :D
 
.* wird schonmal nicht gehen, da der Punkt jedes Zeichen, also auch das y matchen würde ;)

Die Sache ist (?!xxx) heißt, das xxx nicht mehr vorkommt, also gar nicht mehr.
Was ich haben wollte mach ich jetzt glaub mit:

Nee das stimmt nicht. q(?!xxx) bedeutet nur dass xxx nicht direkt auf q folgen dar. qpxxx ist aber erlaubt.

Siehst du auch wenn du in meinem Beispiel
final String toMatch = "testhalltest2hallo";
das einträgst. Das matcht immer noch.
 
Ok, geht schonmal sehr gut, obwohl es so simpel ist.

Gibt es ne Möglichekeit bei dem Muster xxx.*yyy nur an den Teil mit .* zu kommen, ohne den gefundenen String nochmal bearbeiten zu müssen?
Dachte ja, dass MatchResult sowas anbietet, aber das tut es wohl nicht.

Ansonsten muss ich halt nochmal parsen, was halt etwas unschön aussieht, aber vielleicht nicht anders zu machen ist.

mfg Khan
 
Ja du kannst es in eine Group einschließen und dann vom Matcher die Group abrufen:
xxx(.*)yyy
 
Ja .* heißt jedes beliebiges Zeichen, aber wenn dahinter noch ein Muster folgt, versucht er auch das zu matchen.
Das geht also sehr wohl.

String test = hallotesthallohallowelttest;

String muster = "test.*welt";

Holt damit einem "testhallohallowelt" raus.

Wie gesagt hätte ich aber gern "hallohallo", also was zwischen den beiden "Begrenzerworten" steht ;-) , wenn es geht :D.
 
Ah, super.

Jetzt verstehe ich das mit Group :D .
Runde Klammern sind ne Gruppe und das ist der Zusammenhang mit Resultgroup :D .

Danke danke :D
 
Zurück