繁体   English   中英

。*在正则表达式中起什么作用?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM