我需要一个正则表达式来验证用户名使用正则表达式属性。它应匹配不包含任何 requestPathInvalidCharacter (<,>,*,%,&,:,\,?) 的用户名。
所以它应该匹配
AAFA。
AAF8-A
美国航空局
它不应该匹配
aa<fa
AAF>A
AAF*A
AAFA*
AAF%a
AAF&A
AAF:A
AAF\a
AAF?a
到目前为止,我一直在调整这个正则表达式,但在其中一种情况下它仍然失败......
^(?!.*(<|>|*|%|&|:|\|?).*)$
[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("aafa", 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("aafa", pattern));
//Assert.False(Regex.IsMatch("aaf?a", pattern));
}
您预计"aafa"
会失败,但事实并非如此,因为a
是一个转义字符"a"。因此,正则表达式与字符串匹配,因为允许转义的"a"。我怀疑如果字符串包含反斜杠,您预计它会失败。在这种情况下,更改示例字符串并转义反斜杠,或使用逐字字符串:
Regex.IsMatch("aaf\a", pattern) // escaped
Regex.IsMatch(@"aafa", pattern) // verbatim string
进行该更改后,@"^[^<>*%&:\?]+$"
模式将起作用,并且您的断言应该通过。
至于你的负面前瞻模式,它目前接受的比它应该接受的更多,因为它断言匹配是否可能,但实际上并没有消耗任何文本,所以当这不是预期时,它会产生正匹配。若要修复此行为,请向模式添加一些内容以实际匹配(并使用)文本。
// added ".+" before the final "$"
var pattern = @"^(?!.*(" + inner + ").*).+$";
这不应该只是
^[^<>*%&:\?]+$
或
^[^<>*%&:\?]*$
如果空字符串有效
或者,如果invalid
包含 RequestPathInvalidCharacter 则使用自动化
var regex = new Regex(string.Format("^[^{0}]*$",
Regex.Escape(string.Join("",invalid.Split(',')))));