0

我需要使用字符串作为文件的路径,但有时该字符串中有禁止字符,我必须替换它们。例如,我的字符串 _title 是rumbaton jonathan \"racko\" contreras.

好吧,我应该替换字符\".

我试过这个但它不起作用:

_title.Replace(@"/", "");
_title.Replace(@"\", "");
_title.Replace(@"*", "");
_title.Replace(@"?", "");
_title.Replace(@"<", "");
_title.Replace(@">", "");
_title.Replace(@"|", "");
4

6 回答 6

4

由于字符串是不可变的,因此该Replace方法返回一个新字符串,它不会修改您调用它的实例。所以试试这个:

_title = _title
    .Replace(@"/", "")
    .Replace(@"""", "")
    .Replace(@"*", "")
    .Replace(@"?", "")
    .Replace(@"<", "")
    .Replace(@">", "")
    .Replace(@"|", "");

此外,如果您想更换,请"确保您已正确逃脱它。

于 2013-08-21T15:55:02.320 回答
2

尝试正则表达式

string illegal = "\"M\"\\a/ry/ h**ad:>> a\\/:*?\"| li*tt|le|| la\"mb.?";
string regexSearch = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars());
Regex r = new Regex(string.Format("[{0}]", Regex.Escape(regexSearch)));
illegal = r.Replace(illegal, "");

之前:"M"\a/ry/ h**ad:>> a/: ?"| li tt|le|| la"mb.? 之后:玛丽有一只小羊羔。

同一篇文章的另一个答案也更干净

private static string CleanFileName(string fileName)
{
    return Path.GetInvalidFileNameChars().Aggregate(fileName, (current, c) => current.Replace(c.ToString(), string.Empty));
}

如何从路径和文件名中删除非法字符?

于 2013-08-21T15:57:13.677 回答
1

或者你可以试试这个(可能非常低效)的方法:

string inputString = @"File ~!@#$%^&*()_+|`1234567890-=\[];',./{}:""<>? name";
var badchars = Path.GetInvalidFileNameChars();
foreach (var c in badchars)
    inputString = inputString.Replace(c.ToString(), "");

结果将是:

File ~!@#$%^&()_+`1234567890-=[];',.{} name

badchars但是在对它们运行 foreach 循环之前,请随意添加更多字符。

于 2013-08-21T17:06:33.653 回答
0

好的 !感谢您的所有指示,我已经解决了我的问题。这是我的更正:

string newFileName = _artist + " - " + _title;
char[] invalidFileChars = Path.GetInvalidFileNameChars();
char[] invalidPathChars = Path.GetInvalidPathChars();
foreach (char invalidChar in invalidFileChars)
{
        newFileName = newFileName.Replace(invalidChar.ToString(), string.Empty);
}
foreach (char invalidChar in invalidPathChars)
{
        newFilePath = newFilePath.Replace(invalidChar.ToString(), string.Empty);
}

谢谢大家:)

于 2013-08-21T23:55:45.963 回答
0

我已经编写了一种方法来执行您想要的确切操作,并且代码更简洁。

方法

public static string Delete(this string target, string samples) {
    if (string.IsNullOrEmpty(target) || string.IsNullOrEmpty(samples))
        return target;
    var tar = target.ToCharArray();
    const char deletechar = '♣'; //a char that most likely never to be used in the input
    for (var i = 0; i < tar.Length; i++) {
        for (var j = 0; j < samples.Length; j++) {
            if (tar[i] == samples[j]) {
                tar[i] = deletechar;
                break;
            }
        }
    }
    return tar.ConvertToString().Replace(deletechar.ToString(CultureInfo.InvariantCulture), string.Empty);
}

样本

var input = "rumbaton jonathan \"racko\" contreras";
var cleaned = input.Delete("\"\\/*?><|");

将导致:

朗巴顿乔纳森·拉科·孔特雷拉斯

于 2013-08-21T16:52:23.163 回答
0

请参阅http://msdn.microsoft.com/cs-cz/library/fk49wtc1.aspx

返回一个与当前字符串等效的字符串,除了 oldValue 的所有实例都替换为 newValue。

于 2013-08-21T15:56:07.563 回答