文字列に表示されるすべての改行(dbから来る)を取り除く必要があります。私は以下のコードを使用してそれを行います:
value.Replace("\r\n", "").Replace("\n", "").Replace("\r", "")
行末のように振る舞うキャラクターが少なくとも1人いることがわかります。文字コードは 8232 です。
それは私にとって非常に足の不自由ですが、私はこのチャーを見るのが初めてだと言わなければなりません。この文字を直接置き換えることができることは明らかですが、現在のアプローチ(「\ r」と「\ n」の組み合わせを置き換えることに基づいて)をより強固なものに拡張することを考えていたので、 8232 'charだけでなく、まだ私によって見つけられない他のすべて。
そのような問題に対する防弾アプローチはありますか?
編集#1:
私にはいくつかの可能な解決策があるようです:
最良の結果は、1番目と4番目のアプローチを適用した後になると思いますが、どちらを高速化するかは判断できません。最も完全なものはどれだと思いますか?
編集#2
私は下に答えを投稿しました。
以下は私の問題を解決する拡張方法です。 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);
}
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
8232(0x2028)と8233(0x2029)は、排除したい他の唯一のものです。 char.IsSeparator のドキュメントを参照してください。
これについてヨッサリアンに小道具、彼が正しいと思う。すべての空白を単一のスペースに置き換えます。
data = Regex.Replace(data, @"\s+", " ");
すべての空白(char.IsWhitespace)を削除し、単一のスペースに置き換えることをお勧めします。IsWhiteSpaceは、すべての奇妙なUnicode空白を処理します。
string.Replace(Environment.NewLine, "")
を試しましたか?それは通常私のためにそれらの多くを取得します。
これは私の最初の試みですが、これはあなたが望むことをするだろうと思います。
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
このリンクを確認してください: 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\.@-]", "");
}
8232がユニコードであると仮定すると、これを行うことができます:
value.Replace("\u2028", string.Empty);
個人的に私は一緒に行きたい
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();
}
.NET正規表現を使用した簡単なソリューションを次に示します。
s = Regex.Replace(s, @"\s+", "");
(_\s
_はUnicodeの空白文字に一致します)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 を参照してください。
「theString」という文字列がある場合は、Replaceメソッドを使用して、以下に示す引数を指定します。
theString = theString.Replace(System.Environment.NewLine, "");