2016-06-24 8 views
3

私は、文字列負の後読み代替

centenary

を持って、私はそれがcenが付いていない場合にのみ、tenに一致するようにしたいと思います。

これまでのところ、私はこの正規表現を持っている:

ctenaryため true blahtenarytenary次の場合には、偽を返します

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

cetenarycentanary

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

により行方不明のサポートにルックアヘッドまたはルックバックのいずれの場合でも、否定された文字クラスに固執する必要がありますが、[^c][^e][^n] doそれはcxxtenを許可せず、tenの前に3文字がない文字列もカバーしないので、完全にはカバーしません。

(?:^|[^n]|(?:[^e]|^)n|(?:[^c]|^)en)tenが最初に取得したグループにtenを格納しました。 cenと正確に一致しない可能性のある方法のそれぞれの選択肢を作り出しています。

代わりに(.{0,3})(ten)と一致する可能性があり、最初のグループがcenを格納している場合、プログラムで一致を破棄することがあります。

+0

すごい、それじゃない?これは、正規表現エンジンのためのいくつかのオーバーヘッドを作成しますが、うまく動作します。 –

関連する問題