Regex passt nur, wenn das Zeichen nicht direkt vor der gewünschten Zeichenfolge enthalten ist

8

Ich versuche, dieses CodingBat-Problem zu lösen:

  

Gibt true zurück, wenn die angegebene Zeichenfolge eine Darstellung von "xyz" enthält, wobei der xyz nicht direkt ein Punkt (.) vorausgeht. Also "xxyz" zählt aber "x.xyz" nicht.

     

xyzThere ("abcxyz") → wahres
  xyzThere ("abc.xyz") → falsches
  xyzThere ("xyz.abc") → wahr

Ich versuche, dies mit einer Regex zu lösen, aber ich bin nicht sicher, wie man where the xyz is not directly preceeded by a period -Anforderung behandelt.

Meine Lösung für das Problem ohne die Einschränkung ist dies:

%Vor%

Irgendeine Idee, wie man diese Beschränkung mit einer Regex behandelt?

    
bob 18.11.2012, 16:20
quelle

2 Antworten

10

Eine negierte Zeichenklasse sollte den Trick machen: str.matches(".*(?:^|[^.])xyz.*")

Hier verwenden wir eine nicht einfangende Gruppe (?:^|[^.]) , um sicherzustellen, dass wir entweder am Anfang der Zeichenfolge ^ oder an einer beliebigen Position, die keine Periode [^.]

ist, übereinstimmen     
Kelvin 18.11.2012, 16:23
quelle
5

Ich habe diese Lösung persönlich benutzt, aber es gibt eine ganze Reihe anderer Varianten:

%Vor%

Ich stelle nur sicher, dass, wenn vor xyz etwas ist, der Punkt . nicht unmittelbar vorangeht.

Sie können auch eine Look-Behind-Lösung schreiben:

%Vor%

(?<! ) part ist negativ lookbehind und \. (literal period) ist das Muster, gegen das wir prüfen möchten.

    
nhahtdh 18.11.2012 16:32
quelle

Tags und Links