【问题标题】:How to trim the illegal characters from a string如何从字符串中修剪非法字符
【发布时间】:2010-08-26 08:54:00
【问题描述】:

我将使用

从我的计算机中读取文件
   StreamReader sr = new StreamReader(FileName);

            string str = sr.ReadToEnd();

在这里我得到了一些非法字符,例如 /n、/r 和其他一些字符。

我想用空字符替换非法字符。我尝试制作一个字符数组,但我无法删除那些所以任何人都可以帮助我

【问题讨论】:

  • 想必你知道 /r/n 指的是换行符?

标签: c# desktop-application


【解决方案1】:

你可以使用String.Replace方法:

string str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");

但是,如果字符串很长并且您有很长的非法字符列表,这不是一个好主意,因为每次调用Replace 都会创建一个String 的新实例。更好的选择是使用 Linq 过滤掉非法字符:

char[] illegalChars = new[] { '\r', '\n' }; // add other illegal chars if needed
char[] chars = sr.ReadToEnd().Where(c => !illegalChars.Contains(c)).ToArray();
string str = new String(chars);

但是对Contains 的调用会增加开销,直接针对每个非法字符进行测试会更快:

char[] chars = sr.ReadToEnd().Where(c => c != '\r' && c != '\n').ToArray();
string str = new String(chars);

为了完整起见,这里有一个更快的版本:

StringBuilder sb = new StringBuilder();
foreach(char c in sr.ReadToEnd())
{
    if (c != '\r' && c != '\n')
        sb.Append(c);
}
string str = sb.ToString();

【讨论】:

  • 这看起来很有创意,但使用 LINQing 的性能仍然会受到影响。
  • sr.readtoend().where this does not exist na 那我怎么称呼它
  • @Dorababu,只需在您的文件中添加一个using System.Linq 子句(但您不会在智能感知中看到 Where 因为它对字符串是隐藏的)。 @Developer Art,Linq 不会让它变慢......它基本上只是一个带有测试的 foreach 循环,Linq 不会增加那么多开销。然而,对Contains 的调用让它有点慢,所以我发布了一个实际上比你的更快的新版本;)。 StringBuilder.Replace 的问题在于,每次删除一个字符时它都必须移动大块数据
  • 我在2.0中使用有没有其他方法
  • @Dorababu,是的,看看我的最后一次编辑。最后一段代码没有使用Linq
【解决方案2】:
string str = string.Join(string.Empty, File.ReadAllLines(FileName));

【讨论】:

  • 这听起来不错。你能解释一下它是如何删除所有这些非法字符的吗
  • @Dorababu,它所做的只是从文件中删除新行(\r\n)。我不知道你所说的非法字符是什么意思,因为新行不是非法字符,但我的印象是你正在寻找从文件中删除 \r\n 所以我提出了这个解决方案。
【解决方案3】:
StreamReader sr = new StreamReader (FileName);

StringBuilder sb = new StringBuilder (sr.ReadToEnd());

sb.Replace ("\r\n", String.Empty);
sb.Replace ("\n", String.Empty);

string hereIsYourString = sb.ToString ();

【讨论】:

  • 你应该使用String.Empty而不是""
  • 是的,同意,这样看起来会更干净。
  • Replace 的问题在于 StringBuilder 不断在其缓冲区中移动字符。预过滤字符并一个一个添加到StringBuilder中会快很多
猜你喜欢
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 2022-01-01
  • 2014-03-26
  • 2013-08-24
相关资源
最近更新 更多