2016-06-24 12 views
3

Ich habe eine ZeichenfolgeNegativ Lookbehind alternative

centenary

Ich mag würde ten nur passen, wenn es nicht von cen vorausgeht.

Bisher habe ich diese Regex:

(([^c][^e][^n])|^)ten

Das true in den folgenden Fällen kehrt tenary, blahtenary und falsch für ctenary, cetenary, centanary

package main 

import (
    "fmt" 
    "regexp" 
) 

func main() { 
    txt := "ctenary" 
    rx := `(([^c][^e][^n])|^)ten` 
    re := regexp.MustCompile(rx) 
    m := re.MatchString(txt) 
    fmt.Println(m) 
} 
+1

Wenn ich Ihre Frage richtig gelesen habe, suchen Sie nach einer Lookahead Alternative. Du könntest '(?:^| [^ N] | [^ e] n | [^ c] en) (zehn) einen Versuch geben. –

+0

@Aaron Ja, ich möchte "zehn" zuordnen, wenn nicht "cen" vorangestellt ist. Ich habe die Frage bearbeitet. – Kennedy

+0

@SebastianProske Das funktioniert wie erwartet! Danke – Kennedy

Antwort

6

Aufgrund der fehlenden Unterstützung Für Lookahead oder Lookbehind müssen wir bei negierten Zeichenklassen bleiben - aber [^c][^e][^n] tun Es deckt nicht vollständig ab, da es cxxten nicht erlaubt und auch keine Zeichenketten abdeckt, bei denen es nicht 3 Zeichen vor ten gibt.

Ich kam mit (?:^|[^n]|(?:[^e]|^)n|(?:[^c]|^)en)ten, speichert ten in die erste erfasste Gruppe. Es schafft Alternativen für jede mögliche Weise, nicht genau zu entsprechen cen.

Eine Alternative könnte (.{0,3})(ten) entsprechen und die Übereinstimmung programmatisch verwerfen, wenn die erste Gruppe cen speichert.

+0

Erstaunlich, nicht wahr? Es erzeugt einen gewissen Overhead für die Regex-Engine, funktioniert aber gut. –