1

RegularExpressionAttributeを使用してユーザー名を検証するには、正規表現が必要です。requestPathInvalidCharactersのデフォルト値(<,>,*,%,&,:,\,?)を含まないユーザー名と一致する必要があります。

だから合ってるはず

ああ。

aaf8-a

アファ

似合わないはず

aa<fa

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("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));

    }
4

2 に答える 2

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 + ").*).+$";
于 2013-10-11T05:39:16.183 に答える
1

それだけじゃないはず

^[^<>*%&:\\\?]+$ 

また

^[^<>*%&:\\\?]*$ 

空の文字列が有効な場合

またはinvalid、RequestPathInvalidCharacters が含まれている場合は自動化

var regex = new Regex(string.Format("^[^{0}]*$",
                                    Regex.Escape(string.Join("",invalid.Split(',')))));
于 2013-10-09T07:17:41.643 に答える