以下是直接答案。我把它们写得很短,因为如果不了解正则表达式,它们就没有意义。这种理解最好在regular-expressions.info 中获得。我建议您也尝试那里列出的正则表达式帮助工具,它们允许您进行实验 - 在您编辑模式时查看实时捕获/匹配,非常有帮助。
1:插入符号^
是一个锚点,它的意思是“草垛/字符串/线的开始”。
- 如果插入符号是字符类中的第一个符号
[]
,则它具有不同的含义:它否定类。(所以在[^ab]
插入符号中使该类匹配任何不是ab的东西)
2:点.
和星号*
有两个不同的用途:
- 点匹配除换行符以外的任何单个字符
\n
。
- 星号表示“允许零个或多个前面的类型”。
当这两者结合起来时,.*
它基本上读作“零个或多个任何东西,直到换行符或其他规则生效”。
7:美元$
也像插入符号一样是锚,功能相反:“大海捞针”。
编辑:
围绕某事物的简单括号( )
使其成为一个组。在这里你有(?=)
一个断言,特别是一个积极的前瞻性断言。它所做的只是检查里面的内容是否从大海捞针中的当前光标位置向前移动。还在我这儿?
示例: 仅当后跟 时才foo(?=bar)
匹配。从不匹配,只返回。foo
bar
bar
foo
考虑到这一点,让我们剖析您的正则表达式:
/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/
Reads as:
^.* From Start, capture 0-many of any character
(?=.{4,}) if there are at least 4 of anything following this
(?=.*[0-9]) if there is: 0-many of any, ending with an integer following
(?=.*[a-z]) if there is: 0-many of any, ending with a lowercase letter following
(?=.*[A-Z]) if there is: 0-many of any, ending with an uppercase letter following
.*$ 0-many of anything preceding the End
您说密码字符的顺序很重要-在我的测试中并不重要。请参阅下面的测试脚本。希望这能解决一两件事。如果您正在寻找另一个更宽容的正则表达式,请参阅正则表达式密码验证
<pre>
<?php
// Only the last 3 fail, as they should. You claim the first does not work?
$subjects = array("aaB1", "Baa1", "1Baa", "1aaB", "aa1B", "aa11", "aaBB", "aB1");
foreach($subjects as $s)
{
$res = preg_match("/^.*(?=.{4,})(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$/", $s, $matches);
echo "result: ";
print_r($res);
echo "<br>";
print_r($matches);
echo "<hr>";
}
用于检查和测试正则表达式的优秀在线工具:
https ://regex101.com/