[英]What does .* do in regex?
经过广泛的搜索,我找不到在正则表达式中需要使用。*的解释。 例如, MSDN建议使用密码正则表达式为
@\"(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})"
长度> = 6,则1+个数字和1+个特殊字符。
为什么我不能只使用:
@\"(?=.{6,})(?=(\d){1,})(?=(\W){1,})"
.*
仅表示“任何字符中的0个或多个”
它分为两部分:
.
-“点”表示任何字符 *
-表示“ 0个或多个正则表达式令牌实例” 在上面的示例中,这很重要,因为他们希望强制密码包含特殊字符和数字,同时仍然允许所有其他字符。 例如,如果使用\\d
而不是.*
,则这将限制正则表达式的该部分仅匹配十进制字符( \\d
是[0-9]
简写,表示任何十进制)。 同样,用\\W
代替.*\\W
会使该部分仅匹配非单词字符。
可以在以下MSDN上找到包含.NET的许多令牌的良好参考: 正则表达式语言-快速参考
另外,如果您确实想研究正则表达式,请访问http://www.regular-expressions.info/ 。 尽管有时可能很难在该站点上找到所需的内容,但这是我在网上看到的最完整,对初学者友好的正则表达式参考之一。
.*
部分仅允许输入字符的任何组合。 从本质上讲,它允许用户在所需数据的基础上向密码添加任何级别的额外信息。
注意:我认为MSDN页面实际上并不建议将其用作密码验证器。 它只是提供了一个可能的例子。
仅供参考,正则表达式不会按照他们所说的去做,它的编写方式不必要地冗长和混乱。 他们说应该匹配七个以上的字符,但实际上只能匹配六个。 并且,尽管其他两个前瞻正确地匹配了至少一种所需的字符类型,但它们的编写却要简单得多。
最后,您复制的字符串不仅仅是一个正则表达式,它是一个XML属性值(包括括起来的引号),似乎代表了C#字符串文字(除非缺少了引号)。 我从未使用过Membership对象,但是我很确定语法是错误的。 无论如何,实际的正则表达式为:
(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})
..但是应该是:
(?=.{8,})(?=.*\d)(?=.*\W)
第一个前瞻会尝试匹配八个或更多字符。 如果成功,则将匹配位置(或光标,如果需要)重置为开始位置,并且第二个超前扫描将扫描一个数字。 如果找到一个,则光标将再次重置,并且第三个超前扫描将扫描一个特殊字符。 (顺便说一下,其中包括空格,控制字符以及大量其他深奥的字符;可能不是作者想要的。)
如果在后两个前瞻中省略.*
,则将(?=\\d)
断言第一个字符是数字,而(?=\\W)
断言这不是数字。 (数字被分类为单词字符, \\W
匹配不是单词字符的任何字符。)每个前瞻中的.*
使其最初吞噬整个字符串,然后回溯,一次返回一个字符,直到到达一个字符为止。 \\d
或\\W
可以匹配的位置。 这就是它们如何匹配数字和字符串中任意位置的特殊字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.