2017-01-18 240 views
0

基本上,我想實現的是不允許使用大量連續重複的字符/數字的密碼。 我想寫一個函數我傳遞一個字符串和最大允許數量的連續重複字符,它應該告訴我它是否被超過。如何統計字符串中連續重複的字符數

我曾經在的JavaScript做很容易使用以下方式正則表達式:

var regexString = '(.)\\1{' + (maxAllowedRepetitions) + ',}'; 
var regex = new RegExp(regexString); 
return regex.test(string) 

...其中maxAllowedRepetitions是最大極限。如果限制爲3,並且字符串爲'blablabla',則返回false。如果它是blablaaaabla,則返回true,因爲字符'a'重複超過3次。

我發現使用正則表達式難以達到同樣的效果。
我不介意不使用正則表達式。我只需要一個很好的方法來實現這一點。
有什麼建議嗎?

+1

而不使用反向引用,這是不走的支持,可以高效得多,只需使用一個for循環和計數器。 – JimB

回答

2

https://play.golang.org/p/HeK3f4uEvz

package main 

import "fmt" 

func main() { 

    // invalid password with repetition 
    password := "blablaaaabla" 
    fmt.Printf("%s invalid ? %+v\n", password, invalid(password)) 

    // correct password with no repetition 
    password = "blabla" 
    fmt.Printf("%s invalid ? %+v\n", password, invalid(password)) 

    // valid password with unicode character 
    password = "bla∞∞bla" 
    fmt.Printf("%s invalid ? %+v\n", password, invalid(password)) 

    // invalid password with unicode character 
    password = "bla∞∞∞bla" 
    fmt.Printf("%s invalid ? %+v\n", password, invalid(password)) 
} 

func invalid(s string) bool { 
    var lastChar rune 
    var lastCharCount = 0 
    for _, c := range s { 
     if c == lastChar { 
      lastCharCount++ 
      if lastCharCount >= 3 { 
       return true 
      } 
     } else { 
      lastChar = c 
      lastCharCount = 1 
     } 
    } 

    return false 
} 

結果

blablaaaabla invalid ? true 
blabla invalid ? false 
bla∞∞bla invalid ? false 
bla∞∞∞bla invalid ? true 
0

一個簡單的循環應該做的伎倆。請記住Go使用UTF8作爲字符串。你需要比較符文(字符)而不是字節。

1

這工作:

func AbideMaxRepetitions(max int, s string) bool { 
    var rr rune 
    rc := 0 
    for _, r := range s { 
     if rr == r { 
      rc++ 
      if rc > max { 
       return false 
      } 
     } else { 
      rr = r 
      rc = 1 
     } 

    } 
    return true 
} 

當運行:

func main() { 
    ss := []string{"pass", "paaass", "paaaaaaaaaass", "ppa", "pppa", "x", "xx", "xxx"} 
    for _, s := range ss { 
     fmt.Printf("%q: %v\n", s, AbideMaxRepetitions(2, s)) 
    } 
} 

打印:

"pass": true 
"paaass": false 
"paaaaaaaaaass": false 
"ppa": true 
"pppa": false 
"x": true 
"xx": true 
"xxx": false 
相關問題