我有一个如下格式的字符串

string s = "This is a Test String.\n   This is a next line.\t This is a tab.\n'

我想从上面的字符串中删除所有出现的\n和\r。

我已经尝试了string s = s.Trim(new char[] {'\n', '\r'});但这并没有帮助。


当前回答

正确的选择实际上取决于输入字符串的大小以及强制和内存要求,但我会使用像这样的正则表达式

string result = Regex.Replace(s, @"\r\n?|\n|\t", String.Empty);

或者如果我们需要多次应用相同的替换,最好使用Regex的编译版本,如

var regex = new Regex(@"\r\n?|\n|\t", RegexOptions.Compiled); 
string result = regex.Replace(s, String.Empty);

注意:不同的场景需要不同的方法来获得最佳的性能和最小的内存消耗

其他回答

如果速度和低内存使用很重要,可以这样做:

var sb = new StringBuilder(s.Length);

foreach (char i in s)
    if (i != '\n' && i != '\r' && i != '\t')
        sb.Append(i);

s = sb.ToString();

就这么做吧

s = s.Replace("\n", String.Empty).Replace("\t", String.Empty).Replace("\r", String.Empty);

你想要使用字符串。Replace删除一个字符。

s = s.Replace("\n", String.Empty);
s = s.Replace("\r", String.Empty);
s = s.Replace("\t", String.Empty);

注意String。Trim(params char[] trimChars)只从被调用的实例中删除trimChars中的前导字符和尾随字符。

你可以创建一个扩展方法,这样就避免了上面生成大量临时字符串的性能问题:

static string RemoveChars(this string s, params char[] removeChars) {
    Contract.Requires<ArgumentNullException>(s != null);
    Contract.Requires<ArgumentNullException>(removeChars != null);
    var sb = new StringBuilder(s.Length);
    foreach(char c in s) { 
        if(!removeChars.Contains(c)) {
            sb.Append(c);
        }
    }
    return sb.ToString();
}
string remove = Regex.Replace(txtsp.Value).ToUpper(), @"\t|\n|\r", "");

我喜欢使用正则表达式。在这种情况下,你可以这样做:

string replacement = Regex.Replace(s, @"\t|\n|\r", "");

正则表达式在。net世界中不像在动态语言中那么流行,但是它们提供了很多操作字符串的功能。