基本上,我想要实现的是不允许具有大量连续重复的字符/数字的密码。 我正在尝试写一个 go 函数,我传递一个字符串和一个允许的最大连续重复字符数,它应该告诉我它是否被超越。
我曾经在 javascript 中使用正则表达式以下列方式轻松完成:
var regexString = '(.)\\1{' + (maxAllowedRepetitions) + ',}';
var regex = new RegExp(regexString);
return regex.test(string)
...其中maxAllowedRepetitions是最大限制。如果限制为3且字符串为'blablabla',则返回false
。如果是blablaaaabla,则返回true
,因为字符'a'重复超过3次。
我发现使用 go 正则表达式很难实现同样的目标 我不介意不使用正则表达式。我只需要一个很好的方法来实现这一目标 有什么建议吗?
答案 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作为字符串。你需要比较符文(字符)而不是字节。