【问题标题】:How to trim/replace a char '\' or '"' from a string?如何从字符串中修剪/替换字符'\'或'"'?
【发布时间】:2013-08-24 02:28:06
【问题描述】:

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

我应该替换字符 \"

我试过了,但它不起作用:

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

【问题讨论】:

  • 哪种语言?爪哇? C? VB?
  • 字符串在 .NET 中是不可变的。
  • 另外,你永远不会替换 "\""...
  • 总是描述“它不起作用”
  • 基于Path.GetInvalidFileNameChars() 的有用答案是here

标签: c#


【解决方案1】:

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

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

此外,如果您想替换 ",请确保您已正确转义它。

【讨论】:

  • 小bug,看我的评论;p
  • 哦,是的。很好的收获。
  • 我也试试!感谢您的耐心等待!
【解决方案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/:?"| litt|le|| la"mb.? 之后:玛丽有一只小羊羔。

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

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

来自How to remove illegal characters from path and filenames?

【讨论】:

  • 看看第二个答案,干净多了。
  • @HenkHolterman 没有第一,第二或任何顺序的答案,它们按票数排序,可能会发生变化
  • @user1306322 如果你比较每个答案的时间并寻找最老的>最年轻的
  • @DGibbs 很快就很难做到这一点,因为会议纪要不可见,而且我怀疑有人会费力地比较发布日期。除非他们真的想知道这里发生了什么。
  • @DGibbs 哦,你是对的!这个最古老的问题在所有发布的答案附近都有确切的日期:stackoverflow.com/q/4/1306322
【解决方案3】:

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

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

结果将是:

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

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

【讨论】:

  • 谢谢,我就是这么做的(回答上层;))
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

    方法

    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("\"\\/*?><|");
    

    将导致:

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

    【讨论】:

      【解决方案6】:

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

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

      谢谢大家:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-20
        • 1970-01-01
        • 2018-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-07
        相关资源
        最近更新 更多