2010-10-19 135 views
2

我对真正的正则表达式知之甚少。
我想要测试密码验证。这个正则表达式允许“*”吗?

下面是描述它的正则表达式(我没有写出来,不知道是什么意思):

private static string passwordField = "[^A-Za-z0-9_.\\[email protected]#$%^&*()=+;:'\"|~`<>?\\/{}]"; 

我已经试过像“dfgbrk*”,和我的代码的密码,使用上面的正则表达式,允许它。
这是否与正则表达式定义的可接受一致,还是与我的代码有问题?

你能给我一个字符串的例子,验证使用上述正则表达式是不是假设允许?

补充:这里是原来的代码如何使用这个表达式(和它的作品有):

public static bool ValidateTextExp(string regexp, string sText) 
      { 
       if (sText == null) 
       { 
        Log.WriteWarning("ValidateTextExp got null text to validate against regExp {0} . returning false",regexp); 
        return false; 
       } 

       return (!Regex.IsMatch(sText, regexp)); 
      } 

好像我做错了..

感谢。

+1

提供您的其余代码。看看如何使用正则表达式会很有帮助。 – 2010-10-19 17:17:18

+0

该正则表达式包含字符类的否定(以'[^'开头),因此它不应与您的'dfgbrk *'示例匹配。你可以显示一些实际使用'passwordField'字符串的代码吗? – 2010-10-19 17:23:07

+0

为什么你想禁止密码中的某些字符? – CodesInChaos 2010-10-21 18:57:47

回答

8

您的正则表达式匹配包含任何单个字符的值,该值是该列表中的而不是

您的测试值匹配,因为它有空格,它似乎不在您的表达式中。

其原因是not是因为你的角色类以^开头。它匹配任何包含任何不是的单个字符的值的原因是因为您没有指定字符串的开始或结尾或任何量词。

上述假设我绝不错过中的人物汤:)

这个答案中间的任何字符的重要性也取决于你如何在实际代码中使用正则表达式。


如果你的目的是为正则表达式的字符串来表示实际上允许在密码中的字符,你会改变的正则表达式,像这样:

string pattern = "^[A-Z0-9...etc...]+$"; 

的重要组成部分有:

  • ^已从支架内部移除到外面;它表示整个字符串的开始。
  • $已被添加到结尾,它表示整个字符串的结尾。
  • 这些都是需要的,因为否则,您的模式将匹配包含任何内部任何有效值的任何内容 - 即使无效值也存在。
  • 终于,我添加了+量词,这意味着你想找到这些有效字符中的任何一个,一次或多次。 (此正则表达式不会允许一个长度为0密码)

如果你想允许^性格也作为密码的一部分,你想补充回来在括号之间,但只是*不如第一开头的括号后面的东西[。因此,例如:

string pattern = "^[A-Z0-9^...etc...]+$"; 

^具有在不同时间的正则表达式不同的地方特殊的意义。

+1

是的,他们真的应该增加一个空间来表达。禁止使用空间不好。我有时候喜欢在我的密码中使用尾随的空格,以防意外打印出来。 – 2010-10-19 17:20:10

+0

空间在密码:) – 2010-10-19 17:20:57

+0

#安德鲁:非常感谢,我很确定现在我没有在代码中正确使用它,所以我只想知道它是什么意思,以便我知道该怎么做期待我的代码返回(验证或不是).. – 2010-10-19 17:24:04

5
[^A-Za-z0-9_.\[email protected]#$%^&*()=+;:'\"|~`?\/{}] 
----------------------^

对我来说看起来不错,至少在你的问题标题方面。我还不清楚为什么你的样本中的空间不会将它绊倒。

请注意,我假设此表达式的目的是查找无效字符。因此,如果表达式是正匹配,那么您必须拒绝密码错误。

bool isGoodPassword = !Regex.IsMatch(@"[^A-Za-z0-9_.\-!...]", requestedPassword); 

你可以重新写了一个积极的匹配(不否定),像这样:由于似乎对这个有些混乱,也许我可以用一点点伪代码清除掉

bool isGoodPassword = Regex.IsMatch(@"^[A-Za-z0-9_.\-!...]+$", requestedPassword); 

新表达式匹配一个字符串,该字符串从字符串的开始处填充一个或多个列表中的任何字符,直到结束。任何不在列表中的字符都会导致匹配失败。

+3

还有一个字符类否定。 – codaddict 2010-10-19 17:17:00

+1

@codaddict - 表达式也会否定所有字母数字字符,所以我很确定“这个表达式是否与任何无效字符相匹配?” – 2010-10-19 17:18:16

+0

但是,正则表达式是从字符类'[^ A-Za-z'的否定开始的......所以它如何接受他的“dfgbrk *”我知道正则表达式很好,我很困惑 – 2010-10-19 17:20:34

4

你正则表达式只是一个倒序字符类,只描述一个单个字符(但不能是*)。所以这取决于你如何使用这个角色类。

2

取决于您如何应用它。它描述了一个字符,然而,^在开始的时候会给我一点儿困扰,因为它禁止了其他任何角色,所以这里可能有些可怕的东西。

编辑:正如在其他答案中指出的,你的字符串匹配的原因是空间,而不是被这条线取代的解释。