我对正则表达式的了解很少 我正在尝试测试密码验证。
这是描述它的正则表达式(我没有写它,也不知道它意味着什么):
private static string passwordField = "[^A-Za-z0-9_.\\-!@#$%^&*()=+;:'\"|~`<>?\\/{}]";
我尝试过像“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));
}
看来我做错了什么..
感谢。
答案 0 :(得分:8)
您的正则表达式匹配的值包含该列表中不的任何单个字符。
您的测试值是匹配的,因为中有空格,它们似乎不在您的表达式中。
它是not
的原因是因为你的角色类以^
开头。它匹配包含任何单个字符的任何值的原因不是因为您没有指定字符串的开头或结尾,或者是任何量词。
以上假设我并没有错过角色汤中间任何角色的重要性:)
此答案还取决于您在代码中实际使用正则表达式的方式。
如果您打算将该Regex字符串表示密码中实际允许的唯一字符,您可以像这样更改正则表达式:
string pattern = "^[A-Z0-9...etc...]+$";
重要的部分是:
^
已从支架内部移至外部;它表示整个字符串的开头。$
已添加到结尾,表示整个字符串的结尾。+
量词,这意味着你想要找到任何一个有效字符,一次或多次。 (此正则表达式不允许使用0长度的密码)如果你想允许^
字符作为密码的一部分,你可以将它添加回括号之间,但只是*不是开头括号[
之后的第一个字符。例如:
string pattern = "^[A-Z0-9^...etc...]+$";
^
在Regexes的不同时间在不同的地方有特殊含义。
答案 1 :(得分:5)
[^A-Za-z0-9_.\-!@#$%^&*()=+;:'\"|~`?\/{}] ----------------------^
对我来说很好,至少在你的问题标题方面。我还不清楚为什么你的样本中的空格不会绊倒它。
请注意,我假设此表达式的目的是查找无效字符。因此,如果表达式是肯定匹配,则您必须拒绝密码错误。由于似乎有一些混乱,也许我可以用一些伪代码清除它:
bool isGoodPassword = !Regex.IsMatch(@"[^A-Za-z0-9_.\-!...]", requestedPassword);
你可以重新写一个积极匹配(没有否定),如下所示:
bool isGoodPassword = Regex.IsMatch(@"^[A-Za-z0-9_.\-!...]+$", requestedPassword);
新表达式匹配一个字符串,该字符串从字符串的开头填充列表中的一个或多个字符,一直到结束的方式。列表中没有的任何字符都会导致匹配失败。
答案 2 :(得分:4)
你的正则表达式只是一个倒置的字符类,只描述一个字符(但不能是*
)。所以这取决于你如何使用该角色类。
答案 3 :(得分:2)
取决于您如何应用它。它只描述了一个字符,然而,开头的^
会让我感到有些不安,因为它会禁止所有其他角色,所以那里可能存在一些非常可疑的东西。
编辑:正如其他答案所指出的,你的字符串匹配的原因是空格,而不是被这一行代替的解释。