我需要使用RegularExpressionAttribute验证用户名的正则表达式。它应匹配不包含requestPathInvalidCharacters(<,>,*,%,&,:,\,?)的任何默认值的用户名。
所以它应匹配
AAFA。
aaf8-A
AAFA
它不应该匹配
aa<fa
AAF&gt;一种
AAF *一个
AAFA *
AAF%一
AAF&安培;一
AAF:一个
AAF \一
AAF?一个
到目前为止,我一直在调整这个正则表达式,但在其中一个案例中它仍然失败......
^(?!.*(<|>|\*|%|&|:|\\|\?).*)$
[Fact] public void CanValidateAgainstInvalidCharacter() { var result = true; Assert.True(result);
var listWeDontWant = @"<,>,*,%,&,:,\,?";
var inner = listWeDontWant.Split(',').Select(x => Regex.Escape(x)).Aggregate((s, s1) => s + "|" + s1);
//inner = @"\\";
var pattern = @"^(?!.*(" + inner + ").*)$";
Debug.WriteLine(pattern);
//var isMatch = ;
//Debug.WriteLine(isMatch);
pattern = @"^[^<>*%&:\\\?]+$";
Assert.False(Regex.IsMatch("aaf\a", pattern));
// Assert.True(Regex.IsMatch("aafa.", pattern));
// Assert.True(Regex.IsMatch("aaf8-a", pattern));
//Assert.True(Regex.IsMatch("aafa", pattern));
//Assert.True(Regex.IsMatch("aafa", pattern));
//Assert.True(Regex.IsMatch("aa,fa", pattern));
//Assert.True(Regex.IsMatch("aafa", pattern));
//Assert.False(Regex.IsMatch("aa<fa", pattern));
//Assert.False(Regex.IsMatch("aaf>a", pattern));
//Assert.False(Regex.IsMatch("aaf*a", pattern));
//Assert.False(Regex.IsMatch("aafa*", pattern));
//Assert.False(Regex.IsMatch("aaf%a", pattern));
//Assert.False(Regex.IsMatch("aaf&a", pattern));
//Assert.False(Regex.IsMatch("aaf:a", pattern));
//Assert.False(Regex.IsMatch("aaf\a", pattern));
//Assert.False(Regex.IsMatch("aaf?a", pattern));
}
答案 0 :(得分:2)
您希望"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 + ").*).+$";
答案 1 :(得分:1)
不应该只是
^[^<>*%&:\\\?]+$
或
^[^<>*%&:\\\?]*$
如果空字符串有效
如果invalid
包含RequestPathInvalidCharacters
var regex = new Regex(string.Format("^[^{0}]*$",
Regex.Escape(string.Join("",invalid.Split(',')))));