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

时间:2019-04-04 02:45:28

标签: regex go regex-lookarounds

我无法将此正则表达式转换为Golang支持的东西。我可以帮忙吗?它最初来自this SO question

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

这是标准:

  
      
  1. 仅包含字母数字字符,   下划线
  2.   
  3. 下划线和点不能在结束或   用户名的开始(例如_username / username_ / .username / username.)。
  4.   
  5. 下划线和点不能彼此相邻(例如user_.name)。
  6.   
  7. 下划线或点不能连续连续使用多次(例如user__name / user..name)。
  8.   

1 个答案:

答案 0 :(得分: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。使用第三方引擎

我发现this .NET-based engine应该支持环视。如果以前的解决方案不适合您,则可以考虑一下。请注意,该引擎的作者建议尽可能使用内置引擎:

  

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