web-dev-qa-db-ja.com

文字列のすべての改行を削除する方法は?

文字列に表示されるすべての改行(dbから来る)を取り除く必要があります。私は以下のコードを使用してそれを行います:

value.Replace("\r\n", "").Replace("\n", "").Replace("\r", "")

行末のように振る舞うキャラクターが少なくとも1人いることがわかります。文字コードは 8232 です。

それは私にとって非常に足の不自由ですが、私はこのチャーを見るのが初めてだと言わなければなりません。この文字を直接置き換えることができることは明らかですが、現在のアプローチ(「\ r」と「\ n」の組み合わせを置き換えることに基づいて)をより強固なものに拡張することを考えていたので、 8232 'charだけでなく、まだ私によって見つけられない他のすべて。

そのような問題に対する防弾アプローチはありますか?

編集#1:

私にはいくつかの可能な解決策があるようです:

  1. regex.Replaceを使用する
  2. isSeparatorまたはIsControlの場合、すべての文字を削除します
  3. isWhiteSpaceの場合、「」に置き換えます
  4. 考えられるすべての行末のリスト(「\ r\n」、「\ r」、「\ n」、LF、VT、FF、CR、CR + LF、NEL、LS、PS)を作成し、それらを単に空に置き換えます文字列。それは多くの置き換えです。

最良の結果は、1番目と4番目のアプローチを適用した後になると思いますが、どちらを高速化するかは判断できません。最も完全なものはどれだと思いますか?

編集#2

私は下に答えを投稿しました。

43
IamDeveloper

以下は私の問題を解決する拡張方法です。 LineSeparatorとParagraphEndingは、静的な値などとして、もちろんどこか別の場所で定義できます。

public static string RemoveLineEndings(this string value)
{
    if(String.IsNullOrEmpty(value))
    {
        return value;
    }
    string lineSeparator = ((char) 0x2028).ToString();
    string paragraphSeparator = ((char)0x2029).ToString();

    return value.Replace("\r\n", string.Empty)
                .Replace("\n", string.Empty)
                .Replace("\r", string.Empty)
                .Replace(lineSeparator, string.Empty)
                .Replace(paragraphSeparator, string.Empty);
}
62
IamDeveloper

wikipedia によると、処理する必要のある行終端記号が多数あります(この1つを含む)。

LF:改行、U + 000A
VT:垂直タブ、U + 000B
FF:フォームフィード、U + 000C
CR:キャリッジリターン、U + 000D
CR + LF:CR(U + 000D)に続いてLF(U + 000A)
NEL:次の行、U + 0085
LS:行区切り記号、U + 2028
PS:段落区切り、U + 2029

24
Tremmors

8232(0x2028)と8233(0x2029)は、排除したい他の唯一のものです。 char.IsSeparator のドキュメントを参照してください。

13
Ed Bayiates

これについてヨッサリアンに小道具、彼が正しいと思う。すべての空白を単一のスペースに置き換えます。

data = Regex.Replace(data, @"\s+", " ");
9
csharptest.net

すべての空白(char.IsWhitespace)を削除し、単一のスペースに置き換えることをお勧めします。IsWhiteSpaceは、すべての奇妙なUnicode空白を処理します。

7
nothrow

string.Replace(Environment.NewLine, "")を試しましたか?それは通常私のためにそれらの多くを取得します。

4
Josh

これは私の最初の試みですが、これはあなたが望むことをするだろうと思います。

var controlChars = from c in value.ToCharArray() where Char.IsControl(c) select c;
foreach (char c in controlChars)  
   value = value.Replace(c.ToString(), "");

また、使用できる他のメソッドの詳細については、このリンクを参照してください: Char Methods

4
Robert Iver

このリンクを確認してください: http://msdn.Microsoft.com/en-us/library/844skk0h.aspx

遊んで、自分に合ったREGEX式を作成する必要があります。しかし、ここにスケルトンがあります...

static void Main(string[] args)
{

        StringBuilder txt = new StringBuilder();
        txt.Append("Hello \n\n\r\t\t");
        txt.Append( Convert.ToChar(8232));

        System.Console.WriteLine("Original: <" + txt.ToString() + ">");

        System.Console.WriteLine("Cleaned: <" + CleanInput(txt.ToString()) + ">");

        System.Console.Read();

    }

    static string CleanInput(string strIn)
    {
        // Replace invalid characters with empty strings.
        return Regex.Replace(strIn, @"[^\w\.@-]", ""); 
    }
1
BBC

8232がユニコードであると仮定すると、これを行うことができます:

value.Replace("\u2028", string.Empty);
0
Icemanind

個人的に私は一緒に行きたい

    public static String RemoveLineEndings(this String text)
    {
        StringBuilder newText = new StringBuilder();
        for (int i = 0; i < text.Length; i++)
        {
            if (!char.IsControl(text, i))
                newText.Append(text[i]);
        }
        return newText.ToString();
    }
0
Manatherin

.NET正規表現を使用した簡単なソリューションを次に示します。

  • 文字列から空白を削除するには:s = Regex.Replace(s, @"\s+", "");(_\s_はUnicodeの空白文字に一致します)
  • すべての空白を削除するにはCRとLFを:s = Regex.Replace(s, @"[\s-[\r\n]]+", "");(_[\s-[\r\n]]_は減算構造を含む文字クラスで、CRとLF以外の空白に一致します)
  • 垂直方向の空白を削除するには、_\p{Zs}_(タブ以外の水平方向の空白)と_\t_(タブ)を_\s_:s = Regex.Replace(s, @"[\s-[\p{Zs}\t]]+", "");から減算します。

最後のメソッドを拡張メソッドにラップする:

_public static string RemoveLineEndings(this string value)
{
    return Regex.Replace(value, @"[\s-[\p{Zs}\t]]+", "");
}
_

regex demo を参照してください。

0

「theString」という文字列がある場合は、Replaceメソッドを使用して、以下に示す引数を指定します。

theString = theString.Replace(System.Environment.NewLine, "");

0