正则表达式检查默认值requestPathInvalidCharacters

时间:2013-10-09 07:12:31

标签: .net regex asp.net-mvc

我需要使用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));

    }

2 个答案:

答案 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(',')))));