Regex: "alles ausser dieser Zeichenfolge"

DarthShader

Erfahrenes Mitglied
Hallo,

ich brauche einen Regex, der folgendes matched:

"Beginn mit der Zeichenfolge Test, danach ein Leerzeichen, dann beliebige Zeichen ausser der Zeichenfolge "ab", am Ende ein "*/""

Ich habe es so versucht:


Das [^ab] ist natürlich ein Problem, denn das heißt nicht "nicht ab" sondern es heisst "nicht a oder nicht b" .-/ Wie kann ich in einem RegEx ausdrücken, dass eine Zeichenfolge nicht gematched werden darf?


Vielen Dank!
 

Gumbo

Erfahrenes Mitglied
Hab noch ein wenig rumprobiert:
Code:
Test (?(?!ab\*/).*)\*/
Code:
Test ab*/
Test aba*/
Test bab*/
Nur die letzten beiden sollten gefunden werden.
 

DarthShader

Erfahrenes Mitglied
Hallo,

danke für Eure Antworten, leider funktioniert irgendwie keiner Eurer Vorschläge.

Probier mal Folgendes:
Code:
Test (?!ab)\*/

da bekomme ich keinen Match, z.B. mit "Test ist das hier */", sollte aber matchen nach meiner Beschreibung oben.

Versuchs mal damit:
Code:
Test (?(?=ab)|.*)\*/
Gruß Tom

Ergibt den Fehler:

"Exception in thread "main" java.util.regex.PatternSyntaxException: Unknown inline modifier near index 7
Test (?(?=ab)|.*)\*/"

Hab noch ein wenig rumprobiert:
Code:
Test (?(?!ab\*/).*)\*/
Code:
Test ab*/
Test aba*/
Test bab*/
Nur die letzten beiden sollten gefunden werden.

Aber von den Dreien sollte doch _keiner_ matchen, da ich nicht möchte, dass "ab" irgendwo drin ist.
 

DarthShader

Erfahrenes Mitglied
Wie sieht’s mit folgendem aus?
Code:
Test (?(?!.*ab.*).*)\*/

Mein Code mit dem ich das ausprobiere, sieht so aus:

Code:
Pattern p = Pattern.compile( "Test (?(?!.*ab.*).*)\\*/", Pattern.DOTALL );
Matcher m = p.matcher( "Test jetzt gehts los */" );

if ( m.matches() )
	System.out.println( "match" );
else
	System.out.println( "no match" );

Dein Vorschlag mit

Code:
Test (?(?!.*ab.*).*)\*/

Produziert leider:

Code:
Exception in thread "main" java.util.regex.PatternSyntaxException: Unknown inline modifier near index 7
Test (?(?!.*ab.*).*)\*/
 

Thomas Darimont

Erfahrenes Mitglied
Hallo,

... ich glaube so langsam haben wir alle Permutationen des Ausdrucks durch *g*

schau mal hier:
Java:
/**
 * 
 */
package de.tutorials;

/**
 * @author Tom
 * 
 */
public class RegexMatchingExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String regex = "Test ((?!ab).)*\\*/";
		System.out.println("Test jetzt gehts axxxabaaa los */".matches(regex));
		System.out.println("Test jetzt losaaaaaab*/".matches(regex));
		System.out.println("Test jetzt gehtsa baaaba */".matches(regex));
		System.out.println("Test jetzt gehts los */".matches(regex));
	}
}

Ausgabe:
Code:
false
false
false
true

Gruß Tom
 

DarthShader

Erfahrenes Mitglied
Tatsache, das ist es jetzt :) Findet sich, ausser in der API Dokumentation zum Pattern, irgendwo eine Beschreibung dieser (?!ab) Syntax? Ich kannte das nämlich vorher noch gar nicht...