2016-06-24 3 views
3

대안 나는 문자열 내가이 cen가 선행되지 않은 경우에만 ten 일치하고 싶습니다는 부정적인 lookbehind

centenary

에게 있습니다. 때문에 누락 된 지원에 다음과 같은 경우 ctenary, cetenary에 대한 tenary, blahtenary과 거짓의 true을 반환

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

, 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] en) (10)'시도해보십시오. –

+0

@Aaron 예, "cen"이 선행되지 않을 때 "ten"과 일치시키고 싶습니다. 나는 그 질문을 편집했다. – Kennedy

+0

@SebastianProske 예상대로 작동합니다! 감사합니다 – Kennedy

답변

6

:

지금까지 나는이 정규식이 lookahead 또는 lookbehind 중 하나에 대해 우리는 부정적인 문자 클래스를 고수해야합니다. 그러나 [^c][^e][^n] do 그것은 cxxten을 허용하지 않으며 ten 전에 3 자 수가없는 문자열도 포함하지 않으므로 완전히 덮지 않습니다.

(?:^|[^n]|(?:[^e]|^)n|(?:[^c]|^)en)ten으로 시작하여 첫 번째 캡처 된 그룹에 ten을 저장합니다. cen과 정확하게 일치하지 않는 각각의 가능한 방법에 대한 대안을 만들고 있습니다.

대안은 (.{0,3})(ten)과 일치 할 수 있으며 첫 번째 그룹이 cen을 저장하는 경우 프로그램에서 일치 항목을 무시할 수 있습니다.

+0

놀랍지 않습니까? 그것은 정규식 엔진에 대한 약간의 오버 헤드를 생성하지만 그 작업을 멋지게 수행합니다. –

관련 문제