当我第一次学习 Web 开发时,我一直无法理解的工具之一就是正则表达式。自从我找到第一份工程工作以来已经过去了大约一年半的时间,这种理解程度一直持续到最近。
我以前并不真正需要学习正则表达式,但最近的一个工作项目(移动应用程序、React Native)需要在用户注册页面上对用户名和密码进行前端验证。这个用例非常复杂,需要学习比我知道的更多的东西,但又很容易实现。最后,这感觉就像是在教程中讨论的一个很好的例子,所以我们就在这里!
问题
用户名有最少字符数、至少需要一个数字等等。密码通常也会做同样的事情,通常会添加对密码强度的评估。
对于我们这里的示例,我们希望满足以下条件:
用户名:6 至 16 个字符,仅限字母数字
有效密码:8至32个字符,至少1个字母和1个数字
强密码:有效,加上大小写字母和特殊字符的组合
解决方案
A 部分:我们需要的正则表达式
用户名
虽然在这里接触一些正则表达式是有用的,但以下解释旨在足够清晰,让任何人都能理解。
让我们从用户名开始。我们需要它仅包含字母和数字,并且长度必须在 6 到 16 个字符之间。这就能解决问题:
/^[0-9A-Za-z]{6,16}$/
让我们把这个陈述分成几个部分。
/…/包装/表示正则表达式语句
^表示字符串的开头,while$表示字符串的结尾。基本上,这是确保整个字符串遵循我们的规则,而不仅仅是字符串的子集。
[…]表示一组特定的有效字符,也称为字符类;0-9允许数字、A-Z允许大写字母、a-z允许小写字母。还有其他指标,您可以在正则表达式文档中找到完整列表。
{6,16}表示允许的字符数。如果您刚刚使用{6},则您将测试长度恰好为 6,同时{6,}测试最小长度。
密码
当我们继续测试有效密码时,要求发生了变化。现在我们不再局限于字母和数字,而是需要至少每种不同类型的字符之一。这需要我们对它们中的每一个进行特定的检查,如下所示:
/^(?=.*?[0-9])(?=.*?[A-Za-z]).{8,32}$/
让我们在这里分解一下新符号。
(…)是一个捕获组。您可以使用它们来捕获特定顺序的特定字符。
?=是积极的前瞻。搜索从您在正则表达式中做出此断言的位置向右移动到字符串。
.表示任何字符都是可能的,而表示“零个或多个”字符。
中的额外问号?=.?使搜索变得懒惰,这本质上意味着“在第一次满足此要求后停止查找”。
翻译成简单的英语,我们的语句的第一部分^(?=.*?[0-9])意味着“从字符串的开头,找到一个前面有零个或多个任何字符的数字”。
添加(?=.*?[A-Za-z])意味着对任何字母执行相同的操作,或者“从字符串的开头,找到前面有零个或多个任何字符的字母”。这使我们能够确认指定类型的字符在允许的总集合中是否存在,而不管它出现在字符串中的位置。</