经过广泛搜索后,我无法在正则表达式中找到需要使用.*的解释.例如,MSDN建议使用密码正则表达式
@\"(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})"
Run Code Online (Sandbox Code Playgroud)
长度> = 6,1 +数字和1+特殊字符.
为什么我不能使用:
@\"(?=.{6,})(?=(\d){1,})(?=(\W){1,})"
Run Code Online (Sandbox Code Playgroud)
val*_*rij 16
.* 只是意味着"0或更多的任何角色"
它分为两部分:
. - "点"表示任何字符* - 表示"前面的正则表达式令牌的0个或多个实例"在上面的示例中,这很重要,因为他们希望强制密码包含特殊字符和数字,同时仍允许所有其他字符.例如,如果您使用\d而不是.*,则会限制正则表达式的该部分仅匹配十进制字符(\d简写为[0-9],表示任何小数).类似地,\W而不是.*\W会导致该部分仅匹配非单词字符.
可以在MSDN上找到包含许多.NET令牌的好参考:正则表达式语言 - 快速参考
另外,如果您真的想深入研究正则表达式,请查看http://www.regular-expressions.info/.虽然有时很难在该网站上找到您正在寻找的内容,但它是我在网上看到的最完整,最友好的正则表达式引用之一.
仅供参考,该正则表达式并没有按照他们所说的那样做,而且它的编写方式是不必要的冗长和混乱。他们说它应该匹配七个以上的字符,但实际上只匹配六个字符。虽然其他两个前瞻正确地匹配至少一种所需的字符类型,但它们可以写得更简单。
最后,您复制的字符串不仅仅是一个正则表达式,它是一个 XML 属性值(包括括起来的引号),似乎表示 C# 字符串文字(除了缺少结束引号)。我从未使用过 Membership 对象,但我很确定语法有问题。无论如何,实际的正则表达式是:
(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})
Run Code Online (Sandbox Code Playgroud)
..但应该是:
(?=.{8,})(?=.*\d)(?=.*\W)
Run Code Online (Sandbox Code Playgroud)
第一个前瞻尝试匹配八个或更多的任何字符。如果成功,匹配位置(或光标,如果您愿意)将重置到开头,第二个前瞻扫描数字。如果找到,光标将再次重置,并且第三次前瞻扫描特殊字符。(顺便说一句,其中包括空格、控制字符和大量其他深奥字符;可能不是作者的意图。)
如果您忽略.*后两个前瞻,您将(?=\d)断言第一个字符是数字,并(?=\W)断言它不是数字。(数字被归类为单词字符,并\W匹配任何不是单词字符的内容。).*每个向前查找中的 都会导致它最初吞噬整个字符串,然后回溯,一次返回一个字符,直到到达 或 所在的位置\d。\W可以匹配。这就是它们如何匹配字符串中任意位置的数字和特殊字符。
| 归档时间: |
|
| 查看次数: |
14390 次 |
| 最近记录: |