【发布时间】:2009-04-18 22:38:57
【问题描述】:
目前我在正则表达式方面有一些理论背景,但我几乎从未使用过它们。
我正在尝试开发一些用于一般输入验证的类,并且我正在编写不使用任何正则表达式的方法。我最近读了thisJeff 的文章,现在我在想是否应该重构一些方法以在其中包含正则表达式。
我认为正则表达式用于为解析器和其他任何应用程序构建前端,但显然它们的用途远不止于此。
我意识到并非所有验证都可以或应该使用正则表达式完成,但它们是验证输入的好习惯吗?
【问题讨论】:
目前我在正则表达式方面有一些理论背景,但我几乎从未使用过它们。
我正在尝试开发一些用于一般输入验证的类,并且我正在编写不使用任何正则表达式的方法。我最近读了thisJeff 的文章,现在我在想是否应该重构一些方法以在其中包含正则表达式。
我认为正则表达式用于为解析器和其他任何应用程序构建前端,但显然它们的用途远不止于此。
我意识到并非所有验证都可以或应该使用正则表达式完成,但它们是验证输入的好习惯吗?
【问题讨论】:
正则表达式只是将文本与模式匹配的一种方法。还有其他方法可以在不使用正则表达式的情况下做同样的事情。您不应将正则表达式视为必须包含在代码中的流行语。使用最有效的工具。
对于输入验证,请确保您使用的任何工具都可以让您准确指定要接受的文本类型,并且默认情况下拒绝其他所有内容。正则表达式可让您轻松简洁地针对某些类型的输入执行此操作,这就是许多人使用它们的原因。
【讨论】:
是的!
正则表达式通常可以让您在很短的时间内构建一个相当可靠的输入验证。
在我的书中,做正确的工作、可维护并让您处理其他事情的东西很好。
与往常一样,运用常识,如果正则表达式不适合这项工作,请不要使用它。
【讨论】:
使用正则表达式验证是一个好主意,前提是您不会分支到应用更多的正则表达式:
如果您发现自己正在验证潜在的复杂结构,例如 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})$
您的代码将遇到维护问题。
【讨论】:
我意识到并非所有验证都可以或应该使用正则表达式完成
你说得对,但对于需要完全以某种方式呈现的事物(例如社会保险号、电话号码(在某种程度上)和电子邮件),使用正则表达式可能会有所帮助。
但不要依赖它们。例如,我有一个非常好的电子邮件正则表达式检查,但我也有一个明显伪造的域列表(example.com 和我在我们的数据库中看到的其他一些域(主要是本地内容))来匹配。
【讨论】:
是的 - 正则表达式非常适合输入验证。但是,通常将这些东西尽可能地抽象为其他方法(有时甚至是特殊的验证器对象)是一个非常好的主意。
请记住,正则表达式通常会带来很多麻烦,但总的来说,输入验证是它们相当无条件发挥作用的情况。
【讨论】:
您的问题的答案实际上取决于您的代码的用途。是的,正则表达式很棒,我同意所有以前的答案(我已经阅读过)。
使用正则表达式是验证某些输入的一种方便、快速和巧妙的方法,但也许您需要记住什么是好的代码并将正则表达式应用到正确的位置。我阅读了您发布的文章,并且我认为主题更多地是关于以正确的方式使用正则表达式,即不要仅仅将它们用于解决方案,因为您知道它会很快输入并且它会起作用但在turn 会产生不可读、冗长和可怕的代码。
我不会认为正则表达式是“不好的做法”。我想,他只是想说明,有时你可以多花几分钟时间考虑设计,然后想出一个更好的概念来实现,或者只是断定正则表达式就是那个概念!
【讨论】:
我不知道我会称之为最佳实践,但我当然会使用正则表达式来验证电子邮件地址和操作等内容。如果不是最佳做法,那肯定是一种常见做法。
【讨论】:
您应该在客户端和服务器端都进行验证。正则表达式非常适合确保字符串具有有效的格式(例如,电子邮件地址、电话号码等),但服务器不应仅依赖于此。服务器应自行检查并验证业务正确性(例如,像上面检查数据库中的虚假地址的答案)。
一次是不够的。有不同程度的“有效”。
【讨论】:
如果您要验证的输入是正则语言,那么正则表达式是验证它的正确工具。
【讨论】: