英文:
How to check if a string contain 2 same char in a row?
问题
我有一个正则表达式,像这样:
REGEX_2_SAME_CHARACTER_IN_A_ROW = "^(?:(.)(?!\\))*$"
并且使用该正则表达式检查密码是否包含连续两个相同的字符:
contain2SameCharacterInARow, err := regexp.MatchString(REGEX_2_SAME_CHARACTER_IN_A_ROW, password)
但是我得到了这个错误:
error match regex 2 same char in a row: error parsing regexp: invalid or unsupported Perl syntax: `(?!`
我已经阅读了其他问题,其中使用了regexp.MustCompile
,但我不知道如何处理或编写代码,有人可以帮我解决吗?
你可以在这里查看我用于验证密码的完整代码:
https://play.golang.com/p/5Fj4-UPvL8s
英文:
I have a regex like this
REGEX_2_SAME_CHARACTER_IN_A_ROW = "^(?:(.)(?!\\))*$"
and check password with that regex if it contain 2 same character in a row
contain2SameCharacterInARow, err := regexp.MatchString(REGEX_2_SAME_CHARACTER_IN_A_ROW, password)
but I get this error
error match regex 2 same char in a row: error parsing regexp: invalid or unsupported Perl syntax: `(?!`
I have read other question that using regexp.MustCompile but I don't know how to handle or code it, is there anyone can help me with the solution?
Here you can check my full code for validate password
https://play.golang.com/p/5Fj4-UPvL8s
答案1
得分: 1
你不需要锚点、非捕获组或负向先行断言。只需匹配并捕获任何字符 ((.)
),然后跟随它自己 (\\1
)。
REGEX_2_SAME_CHARACTER_IN_A_ROW = "(.)\\1"
但这引出了下一个问题:Go 正则表达式不支持反向引用,所以你需要找到另一种解决方案。一种解决方案是自己循环遍历字符串。
以下是一个使用简单循环的解决方案:
package main
import (
"errors"
"fmt"
"strings"
)
func main() {
fmt.Println(ValidatePassword("passsword01"))
}
func ContainsRepeatedChar(s string) bool {
chars := strings.Split(s, "")
char := chars[0]
for i := 1; i < len(chars); i++ {
if chars[i] == char {
return true
}
char = chars[i]
}
return false
}
func ValidatePassword(password string) error {
contain2SameCharacterInARow := ContainsRepeatedChar(password)
if contain2SameCharacterInARow {
fmt.Println("duplicated char")
return errors.New("invalid password")
}
fmt.Println("all good")
return nil
}
希望对你有所帮助!
英文:
You don't need the anchor, the non-capturing group, nor the negative lookahead. Simply match and capture any character ((.)
) followed by itself (\\1
).
REGEX_2_SAME_CHARACTER_IN_A_ROW = "(.)\"
But this brings us to the next problem: Go regexes do not support back references, so you need to find a different solution. One would be looping the string yourself.
Here's a solution with a simple loop:
package main
import (
"errors"
"fmt"
"strings"
)
func main() {
fmt.Println(ValidatePassword("passsword01"))
}
func ContainsRepeatedChar(s string) bool {
chars := strings.Split(s, "")
char := chars[0]
for i := 1; i < len(chars); i++ {
if (chars[i] == char) {
return true
}
char = chars[i]
}
return false
}
func ValidatePassword(password string) error {
contain2SameCharacterInARow := ContainsRepeatedChar(password)
if contain2SameCharacterInARow {
fmt.Println("duplicated char")
return errors.New("invalid password")
}
fmt.Println("all good")
return nil
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论