如何为捕获和组正则表达式中括号内的不同字符设置特定范围

How to set a specific range for different characters inside in a bracket that inside in a capture and group regex

我正在尝试为电子邮件提供正则表达式。以下是一些示例:
2020-08-22 marie_curie@hotmail.com
2018-10-22 ab234c_d@gmail.com
用户名部分至少包含1个字符(字母字符)但不超过15个,不能超过3个数字或特殊字符(-,_,&)。
这些字符可以任意顺序
我为用户名部分尝试了几个正则表达式,但我无法控制数字和特殊字符。这是我的正则表达式:
(19\d\d|20\d\d)-(0[1-9]|1[0-2])-([0-2][0-9]|30)\s+([a-z 0-9 _-&]){1,15}@(hotmail|gmail|outlook).com

我怎样才能给他们一个特殊的范围?

一些用户名示例:

marie_curi
ab567cd
kd89as_
abcd

您可以使用

^(?:19|20)\d\d-(?:0?[1-9]|1[0-2])-(?:0?[1-9]|[12][0-9]|3[01])\s+(?!(?:[^@]*[0-9_&-]){3})[a-z0-9_&-]{1,15}@(?:hotmail|gmail|outlook)\.com$

详情:

  • ^ - 字符串的开头
  • (?:19|20)\d\d-(?:0?[1-9]|1[0-2])-(?:0?[1-9]|[12][0-9]|3[01]) - 类似字符串的日期时间,首先是年份(仅 19xx20xx),然后是连字符,然后是月份(10112), -, 然后 01 / 131
  • \s+ - 1+ 个空格
  • (?!(?:[^@]*[0-9_&-]){4})[a-z0-9_&-]{1,15} - 1 到 15 个字母数字和 _&- 不超过三位数的字符,_&- 是允许的(3 是允许的)
  • @ - 一个 @ 字符
  • (?:hotmail|gmail|outlook) - 三个值之一,hotmailgmailoutlook
  • \.com - .com 字符串
  • $ - 字符串结尾。