我試圖創建,如果它在一排3個或更多的重複字符的字符串相匹配的正則表達式(例如AAAAAA,testtttttt,otttttter)。正則表達式來匹配重複的字符
我曾嘗試以下:
regexp.Compile("[A-Za-z0-9]{3,}")
regexp.Compile("(.){3,}")
regexp.Compile("(.)\\1{3,}")
這任何 3個字符匹配成一排,但不能連續人物......我要去哪裏錯了?
我試圖創建,如果它在一排3個或更多的重複字符的字符串相匹配的正則表達式(例如AAAAAA,testtttttt,otttttter)。正則表達式來匹配重複的字符
我曾嘗試以下:
regexp.Compile("[A-Za-z0-9]{3,}")
regexp.Compile("(.){3,}")
regexp.Compile("(.)\\1{3,}")
這任何 3個字符匹配成一排,但不能連續人物......我要去哪裏錯了?
你問什麼不能真正正則表達式,你需要的是(不規則)反向引用來完成。雖然很多正則表達式引擎都實現了它們,但Go使用的RE2並不是。 RE2是一個快速的正則表達式引擎,可以保證線性時間字符串處理,但是沒有已知的方式來實現這種效率的反向引用。 (有關詳細信息,請參閱https://swtch.com/~rsc/regexp/)
解決你的問題,你可能需要尋找一些其他的正則表達式庫。我相信可以找到PCRE的綁定,但我從他們身上沒有親身經歷。
另一種方法是手動分析字符串不使用(IR)的正則表達式。
這裏是醜陋的解決方案,可以自動生成它:
A{3,}|B{3,}|...|Z{3,}|a{3,}|b{3,}|...|z{3,}|0{3,}|1{3,}|...|9{3,}
由於問題的陳述,我在下面的非正則表達式的解決方案最終定居:
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
}
顯然正則表達式的Go的味道不支持[反向引用(HTTP://www.regular-expressions。 info/backref.html),這通常是解決這個問題的方法。 – Asaph