Regex nur entsprechen, wenn der Charakter nicht direkt vor dem gewünschten string
Ich versuche zu lösen diese CodingBat problem:
Gibt true zurück, wenn der übergebene string enthält einen Auftritt von "xyz" wobei das xyz ist nicht direkt Voraus, eine Periode (.). So "xxyz" zählt, sondern "x".xyz" nicht.
xyzThere("abcxyz") → true
xyzThere("abc".xyz") → false
xyzThere("xyz.abc") → true
Ich versuche, diese zu lösen mit einem regex, aber ich bin mir nicht sicher, wie Sie zu behandeln where the xyz is not directly preceeded by a period
Anforderung.
Meine Lösung für das problem ohne die Einschränkung ist diese:
public boolean xyzThere(String str) {
return str.matches(".*xyz.*");
}
Irgendeine Idee, wie man mit den Sprach-Einschränkung mit einer regex?
- Negative lookbehind ist das, was Sie suchen. Aber um es zu verwenden, müssen Sie auch wissen über it Grenzen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer negierten Zeichenklasse sollte den trick tun:
str.matches(".*(?:^|[^.])xyz.*")
Hier verwenden wir eine non-capturing group
(?:^|[^.])
um sicherzustellen, dass wir das Spiel entweder am Anfang der Zeichenfolge^
oder an einer beliebigen position, der nicht in einer Periode[^.]
Ich persönlich mit dieser Lösung, aber es gibt eine ganze Reihe von anderen Varianten:
Ich nur sicherstellen, dass, wenn es etwas gibt, vor
xyz
, dann ist die Zeit.
nicht unmittelbar vorausgehen.Können Sie auch schreiben Sie eine Blick-hinter-Lösung:
(?<! )
Teil negative lookbehind und\\.
(literal-Frist) ist das Muster, das wir prüfen wollen gegen.matches
übernehmen Anker.^
vor und$
auf der Rückseite, mit freundlicher Genehmigung vonmatches
imString
Klasse. Ihr argument wäre korrekt, wenn die Anker wurden nicht angenommen.