如何转换使用Lookahead的正则表达式?

问题描述 投票:0回答:1

我无法将此正则表达式转换为Golang支持的内容。我可以得到一些帮助吗?它最初来自this SO question

^(?=.{1,24}$)(?![_.])(?!.*[_.]{2})[a-zA-Z0-9._]+(?<![_.])$

这是标准:

  1. 仅包含字母数字字符,下划线和点。
  2. 下划线和点不能位于用户名的末尾或开头(例如_username / username_ / .username / username.)。
  3. 下划线和点不能彼此相邻(例如user_.name)。
  4. 下划线或点不能连续多次使用(例如user__name / user..name)。
regex go regex-lookarounds
1个回答
3
投票

我对Go没有任何经验,所以也许有人可以提出更好的解决方案。 以下是我找到的两个选项:

1.编写一个涵盖除长度限制之外的所有内容的正则表达式

你可以使用这样的东西:

^(?:[a-zA-Z0-9]+[._]?[a-zA-Z0-9]+)+$

Regex101 demo

您可以使用len检查字符串长度。这是一个完整的例子:

func main() { 
    var re = regexp.MustCompile(`(?m)^(?:[a-zA-Z0-9]+[._]?[a-zA-Z0-9]+)+$`)
    var str = `username
user_name
user.name
user.name_123
username$$$
_username
username_
user_.name
user._name
user__name
user..name
VeryLongUserNameThatExceedsTheLimit
`
    for i, match := range re.FindAllString(str, -1) {
        if len(match) <= 24 {fmt.Println(match, "found at index", i)}
    }
}

输出:

username found at index 0
user_name found at index 1
user.name found at index 2
user.name_123 found at index 3

Test it online


2.使用第三方引擎

我找到了应该支持Lookarounds的this .NET-based engine。如果以前的解决方案不适合您,您可以查看此内容。请注意,该引擎的作者建议尽可能使用内置引擎:

使用regexp软件包中的RE2引擎可能会更好,只有在需要编写非常复杂的模式或需要与.NET兼容时才应该使用它。

© www.soinside.com 2019 - 2024. All rights reserved.