2017-01-18 281 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 
相关问题