1

大家,

所以我正在学习正则表达式 :-) 耶

我正在学习如何解析至少必须有 1 个大写字母和 1 个数字的密码字符串,并且长度可以在 6 到 12 个字符之间。

我很难理解这一点。

$array = array("Hallo1ween23");

$match = preg_grep('%^(?=[-_a-zA-Z0-9]*?[A-Z])(?=[-_a-zA-Z0-9]*?[a-z])(?=[-_a-zA-Z0-9]*?[0-9])\S{6,12}$%',$array);

foreach($match as $value) {
    echo "<pre>" .$value . "<br>";
}

所以基本上我了解这些部分:

我所知道的例子:

此行%(?<=mail)man%查找以 开头mail和结尾的单词man

好的,所以..(?=[a-z]*?[A-Z])一个简单的版本,但仍然是同样的逻辑。我不明白。

因此,如果有帮助,我将整个阵容分成 3 组。

接下来的两个我不明白。

(?=[-_a-zA-Z0-9]*?[A-Z])
(?=[-_a-zA-Z0-9]*?[a-z])

我知道 \s 表示空白,而 \s 表示非空白,但我并不真正理解它的目的。

(?=[-_a-zA-Z0-9]*?[0-9])\S

这是接受的最小和最大字母。

{6,12}

一些解释会很整洁。

提前致谢 :-)

@塔法里

基本上就是这条线。

(?=[-_a-zA-Z0-9]*?[A-Z])

\S 在整个正则表达式行的末尾。

我明白[-_a-zA-Z0-9]

* 表示零个或多个

? 意味着我们不确定它是否存在

把它放在一起我松了那个。

4

2 回答 2

3

为初学者阅读以下内容Lookahead and Lookbehind Zero-Length Assertions...

以下断言是公认的。

(?!)  - Negative Lookahead     foo(?!bar)  matches foo when not followed by bar
(?=)  - Positive Lookahead     foo(?=bar)  matches foo when followed by bar
(?<!) - Negative Lookbehind    (?<!foo)bar matches bar when bar is preceded by foo
(?<=) - Positive Lookbehind    (?<=foo)bar matches bar when preceded by foo

后面两个我没看懂...

(?=                  look ahead to see if there is:
 [-_a-zA-Z0-9]*?     any character of: '-', '_', 'a' to 'z', 
                     'A' to 'Z', '0' to '9' (0 or more times)
  [A-Z]              any character of: 'A' to 'Z'
)                    end of look-ahead

相同的概念,除了(?=[-_a-zA-Z0-9]*?[a-z])你匹配的任何字符az

接下来,\s匹配空白,并\S匹配非空白。

(?=                  look ahead to see if there is:
 [-_a-zA-Z0-9]*?     any character of: '-', '_', 'a' to 'z',
                     'A' to 'Z', '0' to '9' (0 or more times)
 [0-9]               any character of: '0' to '9'
)                    end of look-ahead
\S                   non-whitespace (all but \n, \r, \t, \f, and " ")

识别以下量词。

*      Match 0 or more times
+      Match 1 or more times
?      Match 1 or 0 times
{n}    Match exactly n times
{n,}   Match at least n times
{n,m}  Match at least n but not more than m times

祝你好运。

于 2013-11-08T08:55:23.497 回答
1

你是对的,用前瞻(?= ... )的表达式把它们分开。唯一需要注意的其他关键事项是通过搜索 regex greediness可以更好地解释其使用。?

所以^(?=[-_a-zA-Z0-9]*?[A-Z])基本上读作:向前看,找到任何字母数字字符和/或连字符或下划线,直到找到至少一个大写字母。

(?=[-_a-zA-Z0-9]*?[a-z])同上:...小写字母。

(?=[-_a-zA-Z0-9]*?[0-9])同上:……数字。

\S假设先行已经满足,转义序列实际上是执行“匹配”的内容。大写\S{6,12}读取为:匹配长度在 6 到 12 个字符之间的任何非空白字符序列。

于 2013-11-07T13:04:27.333 回答