其他教程

其他教程

Products

当前位置:首页 > 其他教程 >

正则表达式:密码必须至少包含八个字符、至少包含一个数字、小写和大写的字母以及特殊字符

GG网络技术分享 2025-03-18 16:15 5


问题描述:

我需要一个正则表达式来检查密码:
密码至少包含八个字符、至少包含一个数字、同时包含小写字母和大写字母以及特殊字符,例如#,?,!)
不能是旧密码或包含用户名,"password"或"websitename"
这里是我的验证表达式,用于限制:八个字符,包括一个大写字母,一个小写字母和一个数字或特殊字符。
(?=^.{8,}$)((?=.\\d)|(?=.\\W+))(?![.\\n])(?=.[A-Z])(?=.[a-z]).*$"
那么,如何写一个正则,限制密码必须是八个字符,包括一个大写字母,一个特殊字符和字母数字字符?

网友观点:

^(?=.?[A-Z])(?=(.[a-z]){1,})(?=(.[\\d]){1,})(?=(.[\\W]){1,})(?!.*\\s).{8,}$
规则:
至少一个大写英文字母
至少一个小写英文字母
至少一位数字
至少一个特殊字符
最少八个字符

正则表达式是什么呢?正则表达式怎么用?

一、什么是正则表达式
正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去匹配符合规则的字符。
注意:正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组,选择,字符类来描述
二、普通字符
大多数的字符仅能够描述它们本身,这些字符称作普通字符,例如所有的字母和数字。
也就是说普通字符只能够匹配字符串中与它们相同的字符。

三:常用的元字符
由于普通字符只能匹配与自身相同的字符,那么正则表达式的灵活性和强大的匹配功能就不能完全展现,于是正则表达式中规定了一系列的特殊字符,这些字符不是按照字符的直接量进行匹配的,而是具有特殊的语义,

代码说明
.匹配除换行符以外的任意字符
\\w匹配字母或数字或下划线或汉字
\\s匹配任意的空白符
\\d匹配数字
\\b匹配单词的开始或结束
^匹配字符串的开始
$匹配字符串的结束

虽然说上面的字符具有特殊含义,但是一些字符只有在某些上下文环境中才具有特殊的含义。
由于它们是构造各种匹配复杂文本的正则表达式的基本字符,所以被称作元字符

\\b ^ $的区别
\\b一般指单词边界(空格、空行、标点、tab、行首字、行尾等都算),如“a java program”中java两边都是空格,就可以匹配上。
^ $是字符串的首尾,一般一行是一个字符串的话,就是行首 行尾
比如用\\bjava\\b和^java$的两个正则尝试匹配字符串
java is the best language in the world
的话, \\bjava\\b 可以匹配到 java, 而 ^java$ 则无法匹配成功

四:转义字符 \\
如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\\来取消这些字符的特殊意义。因此,你应该使用\\.和\\*。当然,要查找\\本身,你也得用\\\\.
例如:deerchao\\.net匹配deerchao.net,C:\\\\Windows匹配C:\\Windows
五:重复匹配
定符,指定数量的代码

代码/语法说明
*重复零次或更多次
+重复一次或更多次
?重复零次或一次
{n}重复n次
{n,}重复n次或更多次
{n,m}重复n到m次

Windows\\d+匹配Windows后面跟1个或更多数字
^\\w+匹配一行的第一个单词(或整个字符串的第一个单词,具体匹配哪个意思得看选项设置)

六:字符类
匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u), 只需要在方括号里列出它们就行了
例:
[aeiou]就匹配任何一个英文元音字母
[.?!]匹配标点符号(.或?或!)
[0-9]代表的含意与\\d就是完全一致的:一位数字
[a-z0-9A-Z_]也完全等同于\\w(如果只考虑英文的话)。

七:分枝条件 |
用|把不同的规则分隔开,相当于或的关系
例:
\\d{5}-\\d{4}|\\d{5} :这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题:使用分枝条件时,要注意各个条件的顺序。如果你把它改成\\d{5}|\\d{5}-\\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。


八:反义
有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字字符都行的情况,这时需要用到反义:

代码/语法说明
\\W匹配任意不是字母,数字,下划线,汉字的字符
\\S匹配任意不是空白符的字符
\\D匹配任意非数字的字符
\\B匹配不是单词开头或结束的位置
[^x]匹配除了x以外的任意字符
[^aeiou]匹配除了aeiou这几个字母以外的任意字符

例子:\\S+匹配不包含空白符的字符串。
<a[^>]+>匹配用尖括号括起来的以a开头的字符串
九:分组
但如果想要重复多个字符又该怎么办?你可以用小括号来指定分组(子表达式),然后你就可以指定这个子表达式的重复次数了
例:
(\\d{1,3}\\.){3}\\d{1,3} 要理解这个表达式,请按下列顺序分析它:
\\d{1,3}匹配1到3位的数字,(\\d{1,3}\\.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\\d{1,3})。如:192.168.123.222
使用小括号的时候,还有很多特定用途的语法。下面列出了最常用的一些:

分类代码/语法说明
捕获(exp)匹配exp,并捕获文本到自动命名的组里
(?<name>exp)匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言(?=exp)匹配exp前面的位置
(?<=exp)匹配exp后面的位置
(?!exp)匹配后面跟的不是exp的位置
(?<!exp)匹配前面不是exp的位置
注释(?#comment)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

十:后项引用

后向引用用于重复搜索前面某个分组(子表达式)匹配的文本。
默认情况下,每个分组会自动拥有一个组号
规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。
例:
\\b(\\w+)\\b\\s+\\1\\b可以用来匹配重复的单词,像go go, 或者kitty kitty
这个表达式首先匹配一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字 \\b(\\w+)\\b,这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\\1)。
注意:

  • 分组0对应整个正则表达式
  • 实际上组号分配过程是要从左向右扫描两遍的:第一遍只给未命名组分配,第二遍只给命名组分配--因此所有命名组的组号都大于未命名的组号
  • 你可以使用(?:exp)这样的语法来剥夺一个分组对组号分配的参与权.

你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?<Word>\\w+)(或者把尖括号换成'也行:(?'Word'\\w+)),这样就把\\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\\k<Word>.
所以上一个例子也可以写成这样:

标签:

提交需求或反馈

Demand feedback