【发布时间】:2018-08-23 00:58:11
【问题描述】:
我有一个适用于除一种情况之外的所有情况的正则表达式,但我无法弄清楚为什么它在这种情况下不起作用,因为逻辑告诉我它应该。
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
上述正则表达式适用于所有规则,并为除此电子邮件地址之外的所有电子邮件地址返回正确的 True 或 False:
peter.peter.canada.ca
如果我在这个无效的电子邮件地址上使用我的 RegEx(它缺少一个 @ 符号!),我的代码就会挂起。我相信我的 RegEx 中有一个无限循环。
感谢您提供的任何帮助,以找出我的 RegEx 公式有什么问题会导致它陷入循环。
【问题讨论】: