J'ai besoin de supprimer tous les sauts de ligne qui apparaissent dans mes chaînes (provenant de db) . Je le fais en utilisant le code ci-dessous:
value.Replace("\r\n", "").Replace("\n", "").Replace("\r", "")
Je peux voir qu'il y a au moins un personnage agissant comme une fin de ligne qui lui a survécu. Le code de caractère est 8232 .
C'est très boiteux de ma part, mais je dois dire que c'est la première fois que j'ai le plaisir de voir ce personnage. Il est évident que je peux simplement remplacer ce caractère directement, mais je pensais étendre mon approche actuelle (basée sur le remplacement des combinaisons de "\ r" et "\ n") à quelque chose de beaucoup plus solide, elle n'incluerait donc pas le ' 8232 ', mais aussi tous les autres non encore trouvés par moi.
Avez-vous une approche à toute épreuve pour un tel problème?
EDIT # 1:
Il me semble qu'il y a plusieurs solutions possibles:
Je dirais que les meilleurs résultats seront obtenus après l’application des première et quatrième approches, mais je ne peux pas décider laquelle sera la plus rapide. Selon vous, lequel est le plus complet?
EDIT # 2
J'ai posté une réponse ci-dessous.
Vous trouverez ci-dessous la méthode d’extension qui résout mon problème. LineSeparator et ParagraphEnding peuvent bien sûr être définis ailleurs, comme des valeurs statiques, etc.
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);
}
Selon wikipedia , il existe de nombreux terminateurs de ligne que vous devrez peut-être gérer (y compris celui que vous mentionnez).
LF: saut de ligne, U + 000A
VT: onglet vertical, U + 000B
FF: saut de page, U + 000C
CR: retour chariot, U + 000D
CR + LF: CR (U + 000D) suivi de LF (U + 000A)
NEL: ligne suivante, U + 0085
LS: séparateur de ligne, U + 2028
PS: séparateur de paragraphe, U + 2029
8232 (0x2028) et 8233 (0x2029) sont les seuls autres que vous pourriez vouloir éliminer. Voir la documentation de char.IsSeparator .
Les accessoires de Yossarian sur celui-ci, je pense qu'il a raison. Remplacez tous les espaces par un seul espace:
data = Regex.Replace(data, @"\s+", " ");
Je recommande de supprimer TOUS les espaces (char.IsWhitespace) et de les remplacer par des espaces simples. IsWhiteSpace prend en charge tous les espaces unicode étranges.
Avez-vous essayé string.Replace(Environment.NewLine, "")
? Cela en reçoit souvent beaucoup pour moi.
C’est ma première tentative, mais je pense que cela fera ce que vous voulez ...
var controlChars = from c in value.ToCharArray() where Char.IsControl(c) select c;
foreach (char c in controlChars)
value = value.Replace(c.ToString(), "");
Voir aussi ce lien pour plus de détails sur les autres méthodes que vous pouvez utiliser: Méthodes Char
Consultez ce lien: http://msdn.Microsoft.com/en-us/library/844skk0h.aspx
Vous devrez jouer et créer une expression REGEX qui vous convient. Mais voici le squelette ...
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\.@-]", "");
}
En supposant que 8232 soit unicode, vous pouvez le faire:
value.Replace("\u2028", string.Empty);
personnellement j'irais avec
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();
}
Voici quelques solutions rapides avec .NET regex:
s = Regex.Replace(s, @"\s+", "");
(\s
correspond à tous les caractères Unicode)s = Regex.Replace(s, @"[\s-[\r\n]]+", "");
([\s-[\r\n]]
est une classe de caractères contenant une construction de soustraction, elle correspond à tout espace sauf CR et LF)\p{Zs}
(tout espace horizontal sauf tab) et \t
(tab) de \s
: s = Regex.Replace(s, @"[\s-[\p{Zs}\t]]+", "");
.Envelopper le dernier dans une méthode d'extension:
public static string RemoveLineEndings(this string value)
{
return Regex.Replace(value, @"[\s-[\p{Zs}\t]]+", "");
}
Voir la démo regex .