Go 如何计算字符串中连续重复的字符数

Go 如何计算字符串中连续重复的字符数,go,Go,基本上,我想要实现的是不允许密码包含大量连续重复的字符/数字。 我正在尝试编写一个go函数,向该函数传递一个字符串和允许的最大连续重复字符数,它应该告诉我是否超过了该值 我曾经在javascript中通过以下方式使用正则表达式轻松完成这项工作: var regexString = '(.)\\1{' + (maxAllowedRepetitions) + ',}'; var regex = new RegExp(regexString); return regex.test(string) 。

基本上,我想要实现的是不允许密码包含大量连续重复的字符/数字。 我正在尝试编写一个go函数,向该函数传递一个字符串和允许的最大连续重复字符数,它应该告诉我是否超过了该值

我曾经在javascript中通过以下方式使用正则表达式轻松完成这项工作:

var regexString = '(.)\\1{' + (maxAllowedRepetitions) + ',}';
var regex = new RegExp(regexString);
return regex.test(string)
。。。其中MaxAllowedRepeations是最大限制。如果限制为3且字符串为“blabla”,则返回
false
。如果是blaaaabla,则返回
true
,因为字符“a”重复了3次以上

我发现使用goregexp很难实现同样的目标。
我不介意不使用regexp。我只是需要一个好方法来实现这一点。

有什么建议吗?

一个简单的循环就可以了。只要记住Go使用UTF8表示字符串。你需要比较符文(字符)而不是字节。

一个简单的循环应该可以做到这一点。只要记住Go使用UTF8表示字符串。您需要比较符文(字符)而不是字节。

结果

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

结果

blablaaaabla invalid ? true
blabla invalid ? false
bla∞∞bla invalid ? false
bla∞∞∞bla invalid ? true
这项工作:

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
这项工作:

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

与其使用go不支持且效率更低的反向引用,不如使用for循环和计数器。与其使用go不支持且效率更低的反向引用,不如使用for循环和计数器。