Regex.Replace重载?

时间:2014-05-27 19:19:22

标签: c# asp.net regex

所以我有以下代码,它生成用户上传的文件的文件数据的sha256哈希值。这样可以正常工作,但有时它包含非法字符(对于Windows操作系统)。

所以我试图实现的是试图去除非法字符。我从微软的网站上取消了这些信息。但是,当使用Regex.Replace()实施时,我告诉它只接受5次重载。

这是令人困惑的,因为这就是我所拥有的,并且我已经三次检查我的hashedfile1name是字符串类型变量。

另一个问题是,对于try catch它告诉我它不知道RegexMatchTimeoutException是什么。但Microsoft's example中没有更多的导入/使用语句。

try
{
    FileUpload1.SaveAs("C:\\direct\\uploads\\" + FileUpload1.FileName);
    using (fs = File.OpenRead("C:\\direct\\uploads\\" + FileUpload1.FileName))
    {
        byte[] bytes = new byte[fs.Length];
        fs.Read(bytes, 0, Convert.ToInt32(fs.Length));
        hashedfile1name = Convert.ToBase64String(hash.ComputeHash(bytes));
    }
    try
    {
        Regex.Replace(hashedfile1name, @"[^\w\.@-]", "", RegexOptions.None, TimeSpan.FromSeconds(1.5));
    }
    catch (RegexMatchTimeoutException)
    {
        hashedfile1name = "";
    }
    FileUpload1.SaveAs("C:\\direct\\uploads\\" + hashedfile1name);
    File.Delete("C:\\direct\\uploads\\" + FileUpload1.FileName);

    Label1.Text = "File name: " + FileUpload1.PostedFile.FileName + " - " + hashedfile1name;
}
catch (Exception ex)
{
    Label1.Text = "ERROR: " + ex.Message.ToString();
}

1 个答案:

答案 0 :(得分:2)

Regex.Replace不会就地取代;它将替换作为字符串返回。细分:

try
{
    Regex.Replace(hashedfile1name, @"[^\w\.@-]", "", RegexOptions.None, TimeSpan.FromSeconds(1.5));
}
catch (RegexMatchTimeoutException)
{
    hashedfile1name = "";
}

可以简单地替换:

hashedfile1name = Regex.Replace(hashedfile1name, @"[^\w\.@-]", "");

您的代码应按预期运行。

(如果要保留整个哈希,可能需要考虑Base-32编码,类似于base64但只使用字母数字字符..NET不包含Base32方法,但提供了一个实现在Shane的回答中here。)