正则表达式:电子邮件包含数字,但它们不是年份模式

Regex: Email contain numbers but they are not on year pattern

我是正则表达式的新手,在学习了一些教程之后,我越来越难以实现像 "Email contain numbers but they are not on year pattern".

这样的匹配条件

所以,我有这个简单的正则表达式 "contain numbers":

\d+(?=@)

考虑到电子邮件地址确实有数字,我想匹配不属于以下其中之一的表达式:

\w*(19|20)\d{2}\D*(?=@)
\w*[6-9][0-9]\D*(?=@)
\w*[0-1][0-9]\D*(?=@)

如何在正则表达式中表达这个?

匹配输入示例:

foo123@gmail.com
a22oo@hotmail.com
hoo567@outlook.com

示例不匹配输入:

foo@gmail.com
johndoe88@hotmail.com
john1976@outlook.com

正则表达式很难反转,即匹配某些东西。

在你的简单情况下,我会解析一个任意长的数字,然后执行签入代码,最好是在将其转换为整数之后。

但是对于你的问题,下面的情况会颠倒大小写,只是或它们在一起[=13​​=]

(\d)|                            1 digit
([2345]\d)|                      2 digits not starting with 0,1,6,7,8,9
(\d\d\d)|                        3 digits
((1[^9]|2[^0]|[03-9]\d)\d\d)|    4 digits not starting with 19 or 20 
(\d\d\d\d\d*)                    5+ digits

像这样。我相信有人可以让它更漂亮。

编辑

这里是完整的正则表达式,现在可以正确测试所有可能的情况,我可以想到匹配您指定的标准,以及适当的边界测试(参见 https://regex101.com/r/sM5aF7/1):

(\b|[^\d\s])(\d|[2345]\d|\d{3}|(1[^9]|2[^0]|[03-9]\d)\d\d|\d{5,})(\D*?@|@)

此正则表达式通过了您的示例:

\D(?![6-9]\d\D)\d{2,3}\D

live demo