How to check if a string contain 2 same char in a row?

huangapple go评论74阅读模式
英文:

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 = &quot;(.)\&quot;

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 (
	&quot;errors&quot;
	&quot;fmt&quot;
	&quot;strings&quot;
)

func main() {
	fmt.Println(ValidatePassword(&quot;passsword01&quot;))
}

func ContainsRepeatedChar(s string) bool {
	chars := strings.Split(s, &quot;&quot;)
	char := chars[0]
	for i := 1; i &lt; 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(&quot;duplicated char&quot;)
		return errors.New(&quot;invalid password&quot;)
	}

	fmt.Println(&quot;all good&quot;)
	return nil
}

huangapple
  • 本文由 发表于 2022年10月31日 15:48:46
  • 转载请务必保留本文链接:https://go.coder-hub.com/74260158.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定