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

Posted

技术标签:

【中文标题】如何转换使用 Lookahead 的正则表达式模式?【英文标题】:How to convert a regex pattern that uses Lookahead? 【发布时间】:2019-08-25 16:29:22 【问题描述】:

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

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

这是标准:

    只包含字母数字个字符, 下划线。 下划线和点不能在结尾开始用户名(例如_username / username_ / .username / username.)。 下划线和点不能相邻(例如user_.name)。 下划线或点不能在一行中多次使用(例如user__name/user..name)。

【问题讨论】:

顺便说一句,最后我忘记了+。请使用更新的模式;否则,它将只允许一个点或下划线。 一般来说,解决正则表达式问题最好的办法就是不使用正则表达式。 【参考方案1】:

我对 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 应该支持 Lookarounds。如果以前的解决方案对您不起作用,您可以研究一下。请注意,该引擎的作者建议尽可能使用内置引擎:

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

【讨论】:

以上是关于如何转换使用 Lookahead 的正则表达式模式?的主要内容,如果未能解决你的问题,请参考以下文章

Redshift / 正则表达式(Positive Lookbehind 和 Positive Lookahead)不起作用

正则表达式的先行断言(lookahead)和后行断言(lookbehind)

BASH:如何在 sed 命令中对字符串使用 Regex Negative Lookahead?

如何将 Java 字符串转换为模式正则表达式?

[正则]前瞻

如何使用 Python 将任何字符串转换为有效的自定义模式?