.net 用于检查默认值requestPathInvalidCharacters的正则表达式

.net 用于检查默认值requestPathInvalidCharacters的正则表达式,.net,regex,asp.net-mvc,.net,Regex,Asp.net Mvc,我需要一个正则表达式来使用验证用户名。它应该匹配不包含(,*,%,&,:,\,?)的任何默认值的用户名 所以它应该匹配 阿法 aaf8-a 阿法 不应该匹配 aaa aaf*a 阿法* aaf%a aaf&a aaf:a aaf\a aaf?a 到目前为止,我一直在调整这个正则表达式,但在其中一个例子中仍然失败 ^(?!.*(<|>|\*|%|&|:|\\|\?).*)$ var listWeDontWant=@“,*,%,&,:,\,?”; var inner=listW

我需要一个正则表达式来使用验证用户名。它应该匹配不包含(,*,%,&,:,\,?)的任何默认值的用户名

所以它应该匹配

阿法

aaf8-a

阿法

不应该匹配

aaa

aaf*a

阿法*

aaf%a

aaf&a

aaf:a

aaf\a

aaf?a

到目前为止,我一直在调整这个正则表达式,但在其中一个例子中仍然失败

^(?!.*(<|>|\*|%|&|:|\\|\?).*)$
var listWeDontWant=@“,*,%,&,:,\,?”;
var inner=listWeDontWant.Split(',).Select(x=>Regex.Escape(x)).Aggregate((s,s1)=>s+“|”+s1);
//内部=@“\\”;
变量模式=@“^(?。*(“+内部+”).*)$”;
Debug.WriteLine(模式);
//var isMatch=;
//Debug.WriteLine(isMatch);
模式=@“^[^*%&:\\\?]+$”;
Assert.False(Regex.IsMatch(“aaf\a”,pattern));
//True(Regex.IsMatch(“aafa.”,pattern));
//True(Regex.IsMatch(“aaf8-a”,pattern));
//True(Regex.IsMatch(“aafa”,pattern));
//True(Regex.IsMatch(“aafa”,pattern));
//True(Regex.IsMatch(“aa,fa”,pattern));
//True(Regex.IsMatch(“aafa”,pattern));
//Assert.False(Regex.IsMatch(“aaa”,模式));
//Assert.False(Regex.IsMatch(“aaf*a”,pattern));
//Assert.False(Regex.IsMatch(“aafa*”,pattern));
//Assert.False(Regex.IsMatch(“aaf%a”,模式));
//Assert.False(Regex.IsMatch(“aaf&a”,模式));
//Assert.False(Regex.IsMatch(“aaf:a”,pattern));
//Assert.False(Regex.IsMatch(“aaf\a”,pattern));
//Assert.False(Regex.IsMatch(“aaf?a”,pattern));
}

这难道不应该吗

^[^<>*%&:\\\?]+$ 
您希望
“aaf\a”
匹配失败,但事实并非如此,因为
\a
是转义字符“a”。因此,正则表达式与字符串匹配,因为允许使用转义的“a”。如果字符串包含反斜杠
\
,我怀疑您希望它失败。在这种情况下,请更改示例字符串并转义反斜杠,或使用逐字字符串:

Regex.IsMatch("aaf\\a", pattern)  // escaped
Regex.IsMatch(@"aaf\a", pattern)  // verbatim string
有了这个更改,
@“^[^*%&:\\\?]+$”
模式将起作用,您的断言应该通过

至于消极的前瞻模式,它目前接受的比它应该接受的更多,因为它断言匹配是否可能,但实际上不使用任何文本,所以它会在不符合预期的情况下产生积极的匹配。要修复此行为,请向模式中添加一些内容以实际匹配(并使用)文本

// added ".+" before the final "$"
var pattern = @"^(?!.*(" + inner + ").*).+$";

猜猜哪一个案例在游戏中失败了?如果没有,也许你可以告诉我们。猜测不是游戏的一部分。然而,当我调整表达式时,它开始在其中一个测试中失败。让我用我一直在使用的测试用例更新我的问题。这也是我一开始的想法。。。但这次试验失败了。变量模式=@“^[^*%&:\\\?]+$”;Assert.False(Regex.IsMatch(“aaf\a”,pattern))@firefly,您正在解析的字符串不包含\它包含\这是一个特殊字符。尝试
Assert.IsFalse(Regex.IsMatch(@“aa\a”,pattern))
Ah处理它。谢谢。这是最好的答案。但是由于鲍勃在你之前回答了(虽然细节少了很多,但也是正确的),我把他标记为被接受的。结果证明我写的测试用例很糟糕……我一直都有正确的表达式(在我开始调整之前),并且拒绝了错误的路径。再次感谢您的详细解释。
^[^<>*%&:\\\?]*$ 
var regex = new Regex(string.Format("^[^{0}]*$",
                                    Regex.Escape(string.Join("",invalid.Split(',')))));
Regex.IsMatch("aaf\\a", pattern)  // escaped
Regex.IsMatch(@"aaf\a", pattern)  // verbatim string
// added ".+" before the final "$"
var pattern = @"^(?!.*(" + inner + ").*).+$";