正则表达式 - 不允许字符时,分号通过单元测试

时间:2015-03-31 11:11:02

标签: c# regex nunit

我正在尝试为Web应用程序中的文件上载编写文件名验证程序。在稍微修改OWASP guidance后,我开始使用

public bool IsValidFileName(string filename)
{
    Regex validFileName = new Regex(@"[a-zA-Z0-9_ -]{1,244}\.[a-zA-Z0-9]{1,10}");
    return validFileName.IsMatch(filename);
}

这个想法是将文件名限制为字母数字,下划线,连字符和空格,只需一个"。"和文件扩展名。然后我写了一堆测试(NUnit),但几乎所有那些本来应该断言的都没有。

将正则表达式修改为"([a-zA-Z0-9_ -]{1,244}).([a-zA-Z0-9]{1,10})") - 在长度组周围添加括号,删除字符串文字并转义"。"现在通过除

之外的所有测试
    [Test]
    public void IsValidFileName_NameContainsSemiColon_ReturnsFalse()
    {
        // Arrange
        string filename = "MyFile;asp.jpg";

        // Act
        bool result = FileExtensions.IsValidFileName(filename);

        // Assert
        Assert.That(result, Is.False);
    }

我需要考虑C#正则表达式中的分号有什么特别之处吗?

2 个答案:

答案 0 :(得分:3)

您的正则表达式不包含start(^)和end($)个字符,因此在您的输入字符串中匹配。将其更改为以下内容:

Regex validFileName = new Regex(@"^[a-zA-Z0-9_ -]{1,244}\.[a-zA-Z0-9]{1,10}$");

不使用这些,测试通过,因为它匹配文件名的子字符串。在您给出的示例中,正则表达式匹配以粗体显示:

  

MyFile的;的 asp.jpg

答案 1 :(得分:0)

您可能应该使用^和$符号来匹配整个输入字符串吗?

^[a-zA-Z0-9_ -]{1,244}\.[a-zA-Z0-9]{1,10}$