文字列から改行文字を削除するにはどうすればよいですか?


181

次の形式の文字列があります

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'});が、役に立ちませんでした。

回答:


321

正規表現を使うのが好きです。この場合、次のことができます。

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

正規表現は、動的言語の場合ほど.NETの世界では一般的ではありませんが、文字列を操作するための多くの機能を提供します。


これは間違いなく私にとって最良の解決策でした。このC#とJavaScriptをスムーズにブレンドするだけで、問題を解決できました。
Joe Brunscheon 2013年

文字列から改行を削除する必要もある同様の問題がありました。私はstring.Replaceでそれをやろうとしましたが、うまくいきませんでした。パラメータとまったく同じ正規表現文字列でRegex.Replaceを使用すると、うまくいきました。ありがとう。
インスタンス

8
100万以上のアイテムを処理するループでこれを使用する場合は注意してください。Regexは単なるString.Replaceよりもはるかに遅い
Nick

このコード例は、問題のないタブ\ tも削除します。
Michael Freidgeim

71

あなたString.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();
}

8
この方法では2つの中間文字列オブジェクトが作成されることに注意してください。文字列のサイズによっては、パフォーマンスとメモリ消費に大きな影響を与える可能性があります。
cdhowie 2010年

40

私はこれが古い投稿であることを知っていますが、改行文字を削除するために使用する方法を共有したいと思いました。

s.Replace(Environment.NewLine, "");

参照:

MSDN String.ReplaceメソッドMSDN Environment.NewLineプロパティ


Monoサポートに最適
Nick

1
クロス環境(つまり、Unixシステムからのデータが供給されるWindowsアプリ)アプリケーションでは、利益よりも多くの問題が発生します。
JakubSzułakiewicz'19 / 06/17

15

速度と低いメモリ使用量が重要な場合は、次のようにします。

var sb = new StringBuilder(s.Length);

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

s = sb.ToString();

はい、私もこれを使用します(拡張メソッドで)。常にStringBuilderを使用することをお勧めします。+1
RPM1984

4
「常にStringBuilderを使用するのは良いことです」<私はプロではありませんが、それは厳密には当てはまりません。Jeff Atwoodによるこの記事は、文字列の操作/連結、そして最終的には最適化についての興味深い洞察を提供します。
Phil Cooper


3

LINQアプローチ:

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

string s1 = String.Join("", s.Where(c => c != '\n' && c != '\r' && c != '\t'));

1
これは、クエリによって返されたそれぞれstring.Joinを呼び出すという一般的なオーバーロードを使用しています。クエリ結果をコンストラクタに渡すだけの方が良いでしょう。 ToStringcharstrings1 = new string(s.Where(....).ToArrary());
juharr 2017年

0

正しい選択は、実際には入力文字列の大きさと、perforceとメモリの要件によって異なりますが、次のような正規表現を使用します。

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

または、同じ置換を複数回適用する必要がある場合は、正規表現のコンパイル済みバージョンを使用することをお勧めします

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

注:最高のパフォーマンスと最小限のメモリ消費を実現するには、さまざまなシナリオでさまざまなアプローチが必要です。


0

ええと…もっと具体的な宇宙の領域を理解してほしい。\t実際には、垂直スペースではなく、水平スペースとして分類されます。(\tメモ帳に挿入してテストしてください)

Javaを使用する場合は、単にを使用してください\v。以下のリファレンスを参照してください。

\h -水平空白文字:

[\t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]

\v -垂直空白文字:

[\n\x0B\f\r\x85\u2028\u2029]

ただし、.NETを使用していることは承知しています。だから、すべての垂直方向のスペースを置き換える私の答えは..

string replacement = Regex.Replace(s, @"[\n\u000B\u000C\r\u0085\u2028\u2029]", "");

それは他のいくつかの質問への答えのように見えます...そしてまた実際の参照が欠落しています...
アレクセイ・レーベンコフ2017


-6

ご参考までに、

Trim()はすでにそれを行っています。

次のLINQPadサンプル:

void Main()
{
    var s = " \rsdsdsdsd\nsadasdasd\r\n ";
    s.Length.Dump();
    s.Trim().Length.Dump();
}

出力:

23
18

5
中央の\ nは削除されません。
FlappySocks
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.