使用正则表达式验证数据是否正确?

Koo*_*bin 7 regex validation logic

我一直在寻找一些文章和帖子,建议不要使用正则表达式来验证用户数据.我不确定所有的事情,但我通常会在电子邮件地址验证的情况下找到它.

所以我想清楚使用正则表达式来验证用户输入是否良好?如果它好,那么验证电子邮件地址有什么不好?

编辑:

所以我们可以说,对于数据类型的基本主要验证,我们可以使用正则表达式并且它是好的,并且对于完全验证,我们需要将它与另一个解析器组合.

对于一般用法中的电子邮件验证的第二部分,我们可以使用它,但根据标准,它是不合适的.是吗?

现在混淆选择正确的答案

Gum*_*mbo 4

它\xe2\x80\x99 很好,因为您可以使用正则表达式以简单的方式表达和测试复杂的模式。

\n

它\xe2\x80\x99 很糟糕,因为正则表达式可能很复杂,而且你可能会做错很多事情。

\n
\n

编辑\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0 好了。Here\xe2\x80\x99s 一些真正的建议:首先确保可以使用正则表达式来表达预期的有效值。也就是说,有效值的语言是常规语言。否则你根本无法使用正则表达式(或者至少不能仅使用正则表达式)!

\n

既然我们知道可以使用正则表达式验证什么,我们应该讨论使用正则表达式验证什么是可行的。如果我们以电子邮件地址为例(就像许多其他人一样),我们应该知道有效的电子邮件地址可能是什么样子(请参阅 RFC 5322):

\n
\n
addr-spec       =   local-part "@" domain\nlocal-part      =   dot-atom / quoted-string / obs-local-part\ndomain          =   dot-atom / domain-literal / obs-domain\ndomain-literal  =   [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]\ndtext           =   %d33-90 /          ; Printable US-ASCII\n                    %d94-126 /         ;  characters not including\n                    obs-dtext          ;  "[", "]", or "\\"\n
Run Code Online (Sandbox Code Playgroud)\n
\n

这里我们看到本地部分可能由一个带引号的字符串组成,该字符串可能包含任何可打印的 US-ASCII 字符(不包括\\"",但包括@)。因此,测试电子邮件地址是否仅包含一个@if是不够的我们希望根据 RFC 5322 允许地址。

\n

另一方面,如果我们想要根据 RFC 5322 允许任何有效的电子邮件地址,我们也会允许在大多数情况下可能不存在或毫无意义的地址(例如""@localhost)。

\n