2016-03-02 188 views
3

我試圖創建,如果它在一排3個或更多的重複字符的字符串相匹配的正則表達式(例如AAAAAA,testtttttt,otttttter)。正則表達式來匹配重複的字符

我曾嘗試以下:

regexp.Compile("[A-Za-z0-9]{3,}") 
regexp.Compile("(.){3,}") 
regexp.Compile("(.)\\1{3,}") 

任何 3個字符匹配成一排,但不能連續人物......我要去哪裏錯了?

+2

顯然正則表達式的Go的味道不支持[反向引用(HTTP://www.regular-expressions。 info/backref.html),這通常是解決這個問題的方法。 – Asaph

回答

6

你問什麼不能真正正則表達式,你需要的是(不規則)反向引用來完成。雖然很多正則表達式引擎都實現了它們,但Go使用的RE2並不是。 RE2是一個快速的正則表達式引擎,可以保證線性時間字符串處理,但是沒有已知的方式來實現這種效率的反向引用。 (有關詳細信息,請參閱https://swtch.com/~rsc/regexp/

解決你的問題,你可能需要尋找一些其他的正則表達式庫。我相信可以找到PCRE的綁定,但我從他們身上沒有親身經歷。

另一種方法是手動分析字符串不使用(IR)的正則表達式。

1

這裏是醜陋的解決方案,可以自動生成它:

A{3,}|B{3,}|...|Z{3,}|a{3,}|b{3,}|...|z{3,}|0{3,}|1{3,}|...|9{3,} 
1

由於問題的陳述,我在下面的非正則表達式的解決方案最終定居:

norm = "this it a ttttt" 
repeatCount := 1 
thresh := 3 
lastChar := "" 
for _, r := range norm { 
    c := string(r) 
    if c == lastChar { 
     repeatCount++ 
     if repeatCount == thresh { 
      break 
     } 
    } else { 
     repeatCount = 1 
    } 
    lastChar = c 
}