【问题标题】:Regex to check for default value requestPathInvalidCharacters正则表达式检查默认值 requestPathInvalidCharacters
【发布时间】:2013-10-16 10:07:40
【问题描述】:

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

所以应该匹配

啊发。

aaf8-a

阿发

不应该匹配

aa<fa

aaf>a

aaf*a

阿发*

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

    }

【问题讨论】:

  • 是在猜测其中哪一种情况在部分游戏中失败了吗?如果没有,也许你可以告诉我们。
  • 猜谜不是游戏的一部分。然而,当我调整表达式时,它开始在这些测试之一中失败。让我用我一直在使用的测试用例来更新我的问题。

标签: .net regex asp.net-mvc


【解决方案1】:

您希望"aaf\a" 匹配失败,但它不会因为\a 是转义字符“a”。因此,正则表达式匹配字符串,因为允许使用转义的“a”。如果字符串包含反斜杠\,我怀疑您预计它会失败。在这种情况下,更改您的示例字符串并转义反斜杠,或使用逐字字符串:

Regex.IsMatch("aaf\\a", pattern)  // escaped
Regex.IsMatch(@"aaf\a", pattern)  // verbatim string

随着更改到位,@"^[^&lt;&gt;*%&amp;:\\\?]+$" 模式将起作用,您的断言应该会通过。

至于你的否定前瞻模式,它目前接受的比它应该接受的更多,因为它断言是否可能匹配,但实际上并没有消耗任何文本,所以当这不是预期的时候它会产生积极的匹配。要解决此问题,请在模式中添加一些内容以实际匹配(并使用)文本。

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

【讨论】:

  • 这是最好的答案。但是由于鲍勃在你之前回答了(并且也是正确的,尽管细节少了很多),所以我将他的答案标记为已接受。所以结果证明我写的是糟糕的测试用例......我一直都有正确的表达方式(在我开始调整之前)并拒绝了错误的路径。再次感谢您的详细解释。
【解决方案2】:

不就是这样吗

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

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

如果空字符串有效

如果invalid 包含 RequestPathInvalidCharacters,则使用自动化

var regex = new Regex(string.Format("^[^{0}]*$",
                                    Regex.Escape(string.Join("",invalid.Split(',')))));

【讨论】:

  • 我一开始也是这么想的……但是这次测试失败了。 var 模式 = @"^[^*%&:\\\?]+$"; Assert.False(Regex.IsMatch("aaf\a", pattern));
  • @firefly,您正在解析的字符串不包含 \ 它包含 \a 这是一个特殊字符。试试Assert.IsFalse(Regex.IsMatch(@"aa\a",pattern))
  • 啊,搞定了。谢谢。
猜你喜欢
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 2015-03-12
  • 2011-12-19
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
相关资源
最近更新 更多