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