-1

我是使用正则表达式的新手,经过一些教程后,我很难实现诸如“电子邮件包含数字但它们不是年份模式”之类的匹配标准。

所以,我有这个简单的“包含数字”的正则表达式:

\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
4

2 回答 2

1

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

在您的简单情况下,我只会解析一个任意长数字,然后检查代码,最好是在将其转换为整数之后。

但是对于您的问题,以下内容会颠倒这些情况,或者将它们一起

(\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*?@|@)
于 2015-09-09T20:21:31.677 回答
0

此正则表达式传递您的示例:

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

现场演示

于 2015-09-10T04:09:41.170 回答