什么。*在正则表达式中做什么?

时间:2014-01-17 22:47:24

标签: c# regex

经过广泛搜索后,我无法在正则表达式中找到需要使用。*的解释。例如,MSDN建议使用

的密码正则表达式
@\"(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})"

长度> = 6,1 +数字和1+特殊字符。

为什么我不能使用:

@\"(?=.{6,})(?=(\d){1,})(?=(\W){1,})"

3 个答案:

答案 0 :(得分:14)

.*仅表示“0或更多任何字符”

它分为两部分:

  • . - “点”表示任何字符
  • * - 表示“前面的正则表达式令牌的0个或多个实例”

在上面的示例中,这很重要,因为他们希望强制密码包含特殊字符和数字,同时仍允许所有其他字符。例如,如果您使用\d代替.*,则会限制正则表达式的该部分仅匹配十进制字符(\d[0-9]的简写,这意味着十进制)。同样,\W代替.*\W会导致该部分仅匹配非单词字符。

可以在MSDN上找到包含许多.NET令牌的好参考:Regular Expression Language - Quick Reference

另外,如果您真的想深入研究正则表达式,请查看http://www.regular-expressions.info/。虽然有时很难找到你在该网站上寻找的内容,但它是我在网上看到的最完整,最友好的正则表达式引用之一。

答案 1 :(得分:2)

.*部分只允许输入任何字符组合。它基本上允许用户在您需要的数据之上向密码添加任何级别的额外信息

注意:我不认为MSDN页面实际上是建议将其作为密码验证器。它只是提供了一个可能的例子。

答案 2 :(得分:2)

仅供参考,正则表达式并不像他们所说的那样做,而且它的编写方式也是不必要的冗长和混乱。他们说它应该匹配超过七个字符,但它确实匹配少至六个。虽然其他两个前瞻正确匹配至少一个所需的字符类型,但它们可以更简单地编写。

最后,您复制的字符串不仅仅是一个正则表达式,它是一个XML属性值(包括封闭的引号),它似乎代表一个C#字符串文字(除了结束引号之外)。我从来没有使用过Membership对象,但我很确定语法是错误的。无论如何,实际的正则表达式是:

(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})

..但它应该是:

(?=.{8,})(?=.*\d)(?=.*\W)

第一个前瞻试图匹配八个或更多任何字符。如果成功,匹配位置(或光标,如果您愿意)将重置为开头,第二个前瞻扫描一个数字。如果找到一个,则再次重置光标,第三个前瞻扫描特殊字符。 (顺便说一下,这包括空格,控制字符和其他一些神秘字符;可能不是作者的意图。)

如果你将.*从后两个前瞻中删除,你会(?=\d)断言第一个字符是数字,而(?=\W)断言它是不是< / em>一个数字。 (数字被归类为单词字符,\W匹配任何不是单词字符的内容。)每个前瞻中的.*会导致它最初吞噬整个字符串,然后回溯,返回一个字符到达\d\W可以匹配的地点的时间。这就是他们如何匹配字符串中任何位置的数字和特殊字符。