哟所有,
所以我正在学习regexp :-) yay
我正在学习如何解析必须包含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}
一些解释很简洁。
提前感谢: - )
@Tafari
基本上就是这条线。
(?=[-_a-zA-Z0-9]*?[A-Z])
在整个正则表达式行的末尾\S
。
我理解[-_a-zA-Z0-9]
*表示零或更多
?意味着我们不确定它是否存在
把它放在一起我松了那个。
答案 0 :(得分: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])
相同的概念,除了您匹配a
到z
的任何字符
接下来,\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
祝你好运。
答案 1 :(得分:1)
你是正确的(?= ... )
表达式look-aheads。唯一需要注意的关键是使用?
,通过搜索正则表达式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个字符的任何非空白字符序列。