这个正则表达式是否允许"*"?

Ore*_*n A 2 c# regex asp.net

我对正则表达式的了解甚少.
我正在尝试测试密码验证.

这是描述它的正则表达式(我没有写它,也不知道它意味着什么):

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

我尝试过像" 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));
            }
Run Code Online (Sandbox Code Playgroud)

看来我做错了什么..

谢谢.

And*_*ber 8

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

您的测试值匹配,因为它中包含空格,这些空格似乎不在您的表达式中.

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

以上假设我没有错过角色汤中间任何角色的重要性:)

这个答案还取决于你如何在代码中实际使用正则表达式.


如果您的意图是使用该Regex字符串来表示密码中实际允许的唯一字符,您可以像这样更改正则表达式:

string pattern = "^[A-Z0-9...etc...]+$";
Run Code Online (Sandbox Code Playgroud)

重要的部分是:

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

如果你想允许^角色作为密码的一部分,你可以将它添加回括号之间,但只是*不是在开始括号之后的第一件事[.例如:

string pattern = "^[A-Z0-9^...etc...]+$";
Run Code Online (Sandbox Code Playgroud)

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


Joe*_*orn 5

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

看起来很好,至少在你的问题标题方面.我还不清楚为什么样品中的空间不会绊倒它.

请注意,我假设此表达式的目的是查找无效字符.因此,如果表达式是肯定匹配,则您必须拒绝密码错误.由于似乎有一些混乱,也许我可以用一些伪代码清除它:

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

您可以重新编写这个用于积极匹配(没有否定),如下所示:

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

新表达式匹配一个字符串,该字符串从字符串的开头填充一个或多个列表中的任何字符,一直到结束的方式.列表中没有的任何字符都会导致匹配失败.

  • 还有一个字符类否定. (3认同)