在正则表达式中做什么。*做什么?
经过广泛搜索后,我无法在正则表达式中找到需要使用。*的解释。 例如, MSDN建议使用密码正则表达式
@\"(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})"
长度> = 6,1 +数字和1+特殊字符。
为什么我不能使用:
@\"(?=.{6,})(?=(\d){1,})(?=(\W){1,})"
仅供参考,正则表达式并没有按照他们的说法去做,而且它的编写方式也是不必要的冗长和混乱。 他们说它应该匹配超过七个字符,但它真的匹配到六个。 虽然其他两个前瞻正确匹配至少一个所需的字符类型,但它们可以更简单地编写。
最后,您复制的字符串不仅仅是一个正则表达式,它是一个XML属性值(包括封闭的引号),它似乎代表一个C#字符串文字(除了结束引号之外)。 我从来没有使用过Membership对象,但我很确定语法是错误的。 无论如何,实际的正则表达式是:
(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})
..但它应该是:
(?=.{8,})(?=.*\d)(?=.*\W)
第一个前瞻试图匹配八个或更多的任何字符。 如果成功,匹配位置(或光标,如果您愿意)将重置为开头,第二个预测将扫描一个数字。 如果找到一个,则再次重置光标,第三个预测扫描特殊字符。 (顺便说一下,这包括空白,控制角色和其他一些神秘人物;可能不是作者的意图。)
如果你将.*
从后两个前瞻中删除,你会(?=\d)
断言第一个字符是一个数字,而(?=\W)
断言它不是一个数字。 (数字被归类为单词字符, \W
匹配任何不是单词字符的东西。)每个前瞻中的.*
会导致它最初吞噬整个字符串,然后回溯,一次返回一个字符,直到达到\d
或\W
可以匹配的位置。 这就是他们如何匹配字符串中任何位置的数字和特殊字符。
.*
仅表示“0或更多任何字符”
它分为两部分:
-
.
– “点”表示任何字符 -
*
– 表示“前面的正则表达式令牌的0个或多个实例”
在上面的示例中,这很重要,因为他们希望强制密码包含特殊字符和数字,同时仍允许所有其他字符。 例如,如果您使用\d
而不是.*
,则会限制正则表达式的该部分仅匹配十进制字符( \d
是[0-9]
缩写,表示任何小数)。 类似地, \W
而不是.*\W
会导致该部分仅匹配非单词字符。
可以在MSDN上找到包含许多.NET令牌的好参考: 正则表达式语言 – 快速参考
另外,如果您真的想深入研究正则表达式,请查看http://www.regular-expressions.info/ 。 虽然有时很难在该网站上找到您正在寻找的内容,但它是我在网上看到的最完整,最友好的正则表达式引用之一。
.*
部分只允许输入任何字符组合。 它基本上允许用户在您需要的数据之上向密码添加任何级别的额外信息
注意:我不认为MSDN页面实际上是在暗示作为密码validation器。 它只是提供了一个可能的例子。