2016-06-24 4 views
3
просмотра назад

У меня есть строкаNegative альтернатива

centenary

Я хотел бы, чтобы соответствовать ten только тогда, когда оно не предшествует cen.

До сих пор у меня есть это регулярное выражение:

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

Это возвращает true в следующих случаях tenary, blahtenary и ложных для 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

Если я правильно прочитал ваш вопрос, вы ищете альтернативный вариант. Вы можете дать '(?:^| [^ N] | [^ e] n | [^ c] ru) (десять)' попытка. –

+0

@Aaron Да, я хочу сопоставить «десять», когда не предшествует «cen». Я отредактировал вопрос. – Kennedy

+0

@SebastianProske Это работает так, как ожидалось! Спасибо – Kennedy

ответ

6

Из-за отсутствующей поддержки для поиска или поиска, нам нужно придерживаться отрицательных классов символов, но [^c][^e][^n] do esn't полностью покрывает его, так как он не позволит cxxten, а также не охватывает строки, где не должно быть 3 символа до ten.

Я придумал (?:^|[^n]|(?:[^e]|^)n|(?:[^c]|^)en)ten, в котором хранятся ten в первую группу. Это создает альтернативы для каждого возможного способа, чтобы точно не соответствовать cen.

Альтернатива может быть сопоставлена ​​(.{0,3})(ten) и отбрасывать соответствие программно, если первая группа хранит cen.

+0

Удивительно, не так ли? Это создает некоторые накладные расходы для двигателя regex, но делает его работу красиво. –