当电子邮件地址没有@符号时,电子邮件正则表达式陷入无限循环

时间:2018-08-23 00:58:11

标签: .net regex vb.net email

我有一个RegEx可以在除一种情况之外的所有情况下使用,并且我无法弄清楚为什么它在这种情况下不起作用,因为逻辑告诉我应该这样做。

RegEx用于检查电子邮件地址是否为有效的电子邮件地址。 (注意:,我熟悉可接受的电子邮件地址标准,但是我并不是在寻找符合那些标准的正则表达式,因为我的雇主对有效的电子邮件地址有自己的规定)

您能告诉我RegEx有什么问题,以便它与我必须使用的有效电子邮件地址规则兼容吗? (请参阅以下规则)

我的RegEx是:

^([\+\-_\.0-9a-zA-Z]([\+\-_\.0-9a-zA-Z]+)*)+@(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]*\.)+[a-zA-Z0-9]{2,17})$

我必须遵循并一直用于构建此RegEx的规则是

  • 有效字符为所有英文字母(a-z),所有数字(0-9),破折号(-),下划线(_),句点(。)和加号(+)。
  • 电子邮件地址的第一个字符可以是下划线(即:_peter@test.com)
  • 一段时间后(例如peter.-@test.com)可以存在破折号
  • 在@符号(即peter。@ test.com)之前不能存在句点
  • 域不能以破折号开头(例如:peter@-test.com)
  • 子域不能以破折号开头(即:peter@test.-com)
  • 域或子域不能是破折号(即:peter@--.com)(即:peter @ test .--)

我一直在使用此VB.NET代码测试电子邮件地址:

Public Const EMAIL_VALIDATE_REGEX As String = "^([\+\-_\.0-9a-zA-Z]([\+\-_\.0-9a-zA-Z]+)*)+@(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]*\.)+[a-zA-Z0-9]{2,17})$"

Public Function IsEmailAddressValid(ByVal sCheckEmailAddress As String) As Boolean
    Try
        sCheckEmailAddress = Trim$(sCheckEmailAddress)
        Return Regex.IsMatch(sCheckEmailAddress, EMAIL_VALIDATE_REGEX)
    Catch Exp As Exception
        Return False
    End Try
End Function

上述RegEx可以使用所有规则,并为除该一个电子邮件地址之外的所有电子邮件地址返回正确的True或False:

  

peter.peter.canada.ca

如果我在此无效的电子邮件地址上使用正则表达式(缺少@符号!),我的代码将挂起。我相信我的RegEx有无限循环。

我非常感谢您提供的任何帮助,找出RegEx公式出了什么问题,该问题会导致它陷入循环。

1 个答案:

答案 0 :(得分:2)

这是问题所在

 (                             # (1 start)
        [\+\-_\.0-9a-zA-Z]
      ( [\+\-_\.0-9a-zA-Z]+ )*      # (2)
 )+                            # (1 end)

您会看到两个类是相同的,并且都嵌入在其中
嵌套量词。

将其更改为

 (                             # (1 start)
     [\+\-_\.0-9a-zA-Z]+
 )                            # (1 end)

你很好。

注意-为了使效率最大化,您的正则表达式会考虑到此

^([+\-_.0-9a-zA-Z]+)@(([0-9a-zA-Z][-\w]*\.)+[a-zA-Z0-9]{2,17})$

 ^ 
 (                                 # (1 start)
      [+\-_.0-9a-zA-Z]+ 
 )                                 # (1 end)
 @
 (                                 # (2 start)
      ( [0-9a-zA-Z] [-\w]* \. )+        # (3)
      [a-zA-Z0-9]{2,17} 
 )                                 # (2 end)
 $

附录1

•A period CANNOT exist immediately before the @ symbol

在这种情况下,如果句号被非句号包围,则使其有效。

^([-+_0-9a-zA-Z]+(?:\.?[-+_0-9a-zA-Z])*)@((?:[0-9a-zA-Z][-\w]*\.)+[a-zA-Z0-9]{2,17})$

 ^ 
 (                             # (1 start)
      [-+_0-9a-zA-Z]+ 
      (?:
           \.?
           [-+_0-9a-zA-Z] 
      )*
 )                             # (1 end)
 @
 (                             # (2 start)
      (?: [0-9a-zA-Z] [-\w]* \. )+
      [a-zA-Z0-9]{2,17} 
 )                             # (2 end)
 $