如何在C#中从字符串中删除'\0'?

55
我想知道如何从字符串中删除'\0'。这可能很简单,但对于我这个新的C#开发人员来说不是。
我有这段代码:
public static void funcTest (string sSubject, string sBody)
{
    Try
      {
        MailMessage msg = new MailMessage(); // Set up e-mail message.
        msg.To = XMLConfigReader.Email;
        msg.From = XMLConfigReader.From_Email;
        msg.Subject = sSubject;
        msg.body="TestStrg.\r\nTest\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\r\n";     
      }
    catch (Exception ex) 
      {
        string sMessage = ex.Message;     
        log.Error(sMessage, ex);   
      }
}

但我想要的是:

msg.body="TestStrg.\r\nTest\r\n";

那么,有没有一种简单的方法来实现这个功能呢?

11个回答

64

看起来你只需要使用string.Replace方法(静态方法)。

var cleaned = input.Replace("\0", string.Empty);

编辑:如您所请求,这是完整的代码:

public static void funcTest (string sSubject, string sBody)
{
    try
    {
        MailMessage msg = new MailMessage();
        msg.To = XMLConfigReader.Email;
        msg.From = XMLConfigReader.From_Email;
        msg.Subject = sSubject;
        msg.Body = sBody.Replace("\0", string.Empty);
    }
    catch (Exception ex) 
    {
        string sMessage = ex.Message;     
        log.Error(sMessage, ex);   
    }
}

你好Noldorin...请问我该如何将这行代码添加到我的函数中。因为当我添加新代码行到函数时,它并不会被执行,我不知道原因在哪里。请帮忙指导一下如何将您提供的代码行插入到我的函数中,以便正常执行。非常感谢... - Davideg
当我修改以下代码时: msg.body = sBody.Replace("\0", string.Empty); 会产生一个构建错误:'System.Web.Mail.MailMessage.body' 由于其保护级别而无法访问。1)为什么会这样? 2)当我向我的项目中添加新代码时,它不会执行并跳过它,我不知道为什么?你能告诉我为什么吗?非常感谢... - Davideg
好的,我认为这段代码会成功。 但是当我向我的函数添加新代码时,它在运行时没有被执行。我不知道该怎么办?你能帮我解决吗? - Davideg

50

I use: something.TrimEnd('\0')


13

这是必应搜索的第一个结果,但它并没有我的首选方法,即

string str = "MyString\0\0\0\0".Trim('\0');

9

你只需要将此内容替换即可。

msg.body="TestStrg.\r\nTest\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\r\n".Replace("\0", string.Empty);    

这里的网络连接太慢了 :( 很快就会发布。 - anishMarokey
10
@Noldorin,因为只相差三分钟就这样非常无礼。 - Anthony Pegram
@Anthony:并不是这样。a)这需要4分钟,b)如果已经有几个相同的答案了,发表相同的答案只是为了获取声望分数是不好的礼仪。 如果我在问题已经被回答后回答得相对较晚,我会适当地删除我的回复。 - Noldorin

6

试试这个:

msg.Body = msg.Body.Replace("\0", "");

看起来应该可以工作。但我现在有另一个问题,需要你的帮助。 当我向C#项目中的任何类添加新的代码行时,这些代码行在运行时不会被执行,调试器也会跳过它们。 1)如何使新代码得到执行? 2)Visual Studio 2005 中是否有属性? 3)还是与 C# 项目有关?提前感谢任何帮助。 - Davideg
1
这听起来像是项目没有被构建,因此任何新的更改都会被忽略。请检查您的项目是否在配置管理器中设置为构建。 - Iain Ward

5

如果您使用LINQ,可能会获得更快的结果。

str.TakeWhile(c => c != '\0');

Linq 的性能更好、更快。


4
msg.body = sBody.Replace("\0", "");

3
var str = "TestStrg.\r\nTest\0\0\0\0\0\0\0\0\0\r\n".Replace("\0", "");

String.Replace() 将用空字符串替换所有的 \0,从而将它们删除。


3
我不是C#专家,但出于好奇,@符号是用来做什么的? - Chris
2
实际上,@符号无法正常工作,因为这意味着它将忽略转义字符并将字符串解释为“反斜杠零”,而不是将其转义为空字符。 - Martin Harris
@ = 转义序列不应被处理。 - Rippo
@Chris:@ 是考虑斜杠作为符号的意思。答案是错误的,这里不应该有 @,因为只替换了一个 \0 符号,而不是两个 \0 - serhio
那么 @"blah\t" 就像 Python 的 r"blah\t" 一样吗? - Chris

2

保持简单 =*

return stringValue.Substring(0, stringValue.IndexOf('\0'));

这正是我所需要的。在第一个\0之后,我有一些垃圾数据,而且这些数据仍然留在了上面的替换方法中。 - Gerhard

1

我知道我来晚了,但是虽然String.Replace在大多数情况下都有效,但我发现我更喜欢正则表达式版本,并且在大多数情况下更可靠。

using System.Text.RegularExpressions;
...

 msg.body=Regex.Replace("TestStrg.\r\nTest\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\r\n","\0");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接