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

时间:2017-01-18 17:24:38

标签: go

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

我曾经在 javascript 中使用正则表达式以下列方式轻松完成:

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

...其中maxAllowedRepetitions是最大限制。如果限制为3且字符串为'blablabla',则返回false。如果是blablaaaabla,则返回true,因为字符'a'重复超过3次。

我发现使用 go 正则表达式很难实现同样的目标 我不介意不使用正则表达式。我只需要一个很好的方法来实现这一目标 有什么建议吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

这有效:

"pass": true
"paaass": false
"paaaaaaaaaass": false
"ppa": true
"pppa": false
"x": true
"xx": true
"xxx": false

运行时:

function onDocumentMouseDown( event ) {
    event.preventDefault();
    mouse.x = ( event.clientX / renderer.domElement.clientWidth ) * 2 - 1;
    mouse.y = - ( event.clientY / renderer.domElement.clientHeight ) * 2 + 1;
    raycaster.setFromCamera( mouse, camera );
    var intersects = raycaster.intersectObjects( clickObjects );
    var intersects2 = raycaster.intersectObjects( objects );
    if ( intersects.length > 0 ) { // Clicking on the ground?
        if ( intersects2.length > 0 ) { // Clicking on an object?
        }else{
            var geometry = new THREE.BoxGeometry( 64, 64, 64);
            var cube = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial( { color: 0xFBF5D7, opacity: 1 } ) );
            cube.position.copy(intersects[0].point);
            cube.position.y = 30;
            cube.flipSided = true;
            cube.doubleSided = true;
            var validposition = true;
            var i;
            for (i = 0; i < objects.length; i++) {
                var dx = cube.position.x - objects[i].position.x;
                var dy = cube.position.y - objects[i].position.y;
                var dz = cube.position.z - objects[i].position.z;
                var distance = dx*dx+dy*dy+dz*dz;
                if(distance < 4096) {
                    validposition = false;
                }
            }
            if(validposition == true) {
                objects.push(cube);
                scene.add(cube);
            }
        }
    }
}

打印:

THREE.BoxGeometry( 64, 64, 400)

答案 2 :(得分:0)

一个简单的循环应该可以解决问题。请记住,Go使用UTF8作为字符串。你需要比较符文(字符)而不是字节。