使用正则表达式进行输入验证是一种好习惯吗?

时间:2009-04-18 22:38:57

标签: regex language-agnostic

目前我在正则表达式中有一些理论背景,但我几乎从未使用它们。

我正在尝试开发一些用于一般输入验证的类,而我正在编写方法而不使用正则表达式。我最近阅读了this Jeff的文章,现在我想知道是否应该重构一些将regexp包含在其中的方法。

我认为正则表达式用于为解析器和其他任何应用程序构建前端,但显然它们的用途远不止于此。

我意识到并非所有验证都可以或应该使用正则表达式完成,但它们是验证输入的好方法吗?

9 个答案:

答案 0 :(得分:5)

正则表达式只是将文本与模式匹配的一种方法。如果不使用正则表达式,还有其他方法可以做同样的事情。您不应该将正则表达式视为必须包含在代码中的术语。使用最好的工具。

对于输入验证,请确保您使用的任何工具都可以指定您要接受的文本类型,并且默认情况下拒绝其他所有内容。正则表达式使您可以轻松简洁地处理某些类型的输入,这就是许多人使用它们的原因。

答案 1 :(得分:4)

是!

正则表达式通常可以让您构建一个非常可靠的输入验证,在非常短的时间内可以读取。

做出正确工作的东西,可以维护,让你可以在我的书中找到其他东西。

与往常一样,应用常识,如果正则表达式是作业的坏工具,请不要使用它。

答案 2 :(得分:4)

使用regexp验证是一个好主意,前提是你不要分支应用多个besic正则表达式:

如果你发现自己正在验证可能复杂的结构,例如Michael Ash,那么他试图验证一个日期,你就会走出困境并提出麻烦:

^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[13-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

您的代码将遇到维护问题。

答案 3 :(得分:2)

  

我意识到并非所有验证都可以或应该使用正则表达式

你是完全正确的,但对于需要完全某种方式的事情(例如社会安全号码,电话号码(在某种程度上)和电子邮件),使用正则表达式可能会有所帮助。

但不要依赖它们。例如,我有一个非常好的电子邮件正则表达式检查,但我也有一个明显的虚假域名列表(example.com和我在我们的数据库中看到的其他一些(主要是本地的东西))来匹配。

答案 4 :(得分:1)

是 - 正则表达式非常适合输入验证。然而,通常将这些东西尽可能地抽象为其他方法 - 甚至有时是特殊的验证器对象,这是一个非常好的主意。

请记住,正则表达式通常会带来很多麻烦,但总的来说,输入验证是一种相当无条件地发光的情况。

答案 5 :(得分:1)

您的问题的答案实际上取决于您的代码的目的。是的,正则表达式很棒,我同意,所有以前的答案(我已阅读)。

使用正则表达式是一种方便,快速和简洁的方法来验证某些输入,但也许你需要记住什么是好的代码并在正确的位置应用正则表达式。我阅读了你发布的文章,我认为主题更多的是关于以正确的方式使用正则表达式,即不要只使用它们作为解决方案因为你知道它会很快打字并且它会起作用但是转向产生不可读,冗长和可怕的代码。

我不会从正则表达式是“坏习惯”的内容中得到它。我想,他只是想把它放在一边,有时你可以花几分钟时间考虑设计并提出一个更好的概念来实现,或者只是得出结论正则表达式是那个概念!

答案 6 :(得分:0)

我不知道我称之为最佳做法,但我当然使用正则表达式验证电子邮件地址和操作等内容。如果不是最佳做法,那肯定是一种常见做法。

答案 7 :(得分:0)

您应该在客户端和服务器端进行验证。正则表达式非常适合确保字符串具有有效格式(例如,电子邮件地址,电话号码等),但服务器不应仅依赖于此。服务器应自行检查并验证业务正确性(例如,上面检查数据库中伪造地址的答案)。

一次是不够的。有不同程度的“有效”。

答案 8 :(得分:0)

如果您要验证的输入是常规语言,那么正则表达式是验证它的正确工具。