gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:55:18 25 4
gpt4 key购买 nike

我有一个适用于除一种情况之外的所有情况的正则表达式,我无法弄清楚为什么它在这种情况下不起作用,因为逻辑告诉我它应该。

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

•@符号前不能存在句点

在这种情况下,如果句点被非句点包围,则只需使句点有效即可。

^([-+_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)
$

关于.net - 当电子邮件地址没有 @ 符号时,电子邮件正则表达式陷入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51976990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com