正则表达式.代替过载

本文关键字:正则表达式 | 更新日期: 2023-09-27 18:05:20

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

所以我要实现的是一个try catch来去掉非法字符。我从微软的网站上找到了这些信息。但是,当使用Regex.Replace()实现时,我被告知它只接受5个过载。

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

另一个问题是,对于try catch,它告诉我它不知道RegexMatchTimeoutException是什么。但是在微软的例子中没有更多的import/using语句。

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

正则表达式.代替过载

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在这里的回答中提供了实现。)