我有一个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的规则是
我一直在使用此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公式出了什么问题,该问题会导致它陷入循环。
答案 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)
$