web-dev-qa-db-fra.com

Comment supprimer tous les caractères d'espacement d'une chaîne?

Chers collègues programmeurs,

Je suis en train de coder quelque chose dans C # Visual Studio 2013 et je viens de me rendre compte que je n'aurais peut-être pas besoin d'utiliser Trim() quand je le ferais Replace(" ", string.Empty).

Un exemple suit:

SanitizedString = RawString
    .Replace("/", string.Empty)
    .Replace("\\", string.Empty)
    .Replace(" ", string.Empty)
    .Trim();

Comme j'avais précédemment ce code structuré différemment, je ne l'ai pas remarqué:

SanitizedString = RawString.Trim()
    .Replace("/", string.Empty)
    .Replace("\\", string.Empty)
    .Replace(" ", string.Empty);

Je suis conscient que ces méthodes fonctionnent différemment, car Trim() supprime tous les caractères d'espacement, alors que Replace(" ", string.Empty) supprime uniquement les caractères d'espacement.

C'est pourquoi j'ai une question différente.

Je ne vois pas de moyen évident d'y parvenir avec Replace. Ma question est la suivante: comment puis-je m'y prendre lorsque je souhaite supprimer tous les caractères d'espacement de la chaîne?

J'ai trouvé ce qui suit:

Moyen efficace de supprimer TOUS les espaces de String?

Mais comme je n'ai jamais utilisé d'expressions régulières, j'hésite sur la façon de l'appliquer à string?

7
Vlastimil

Essayez d’utiliser Linq pour filtrer les espaces:

  using System.Linq;

  ... 

  string source = "abc    \t def\r\n789";
  string result = string.Concat(source.Where(c => !char.IsWhiteSpace(c)));

  Console.WriteLine(result);

Résultat:

abcdef789
14
Dmitry Bychenko

Une façon est d'utiliser Regex

public static string ReplaceAllWhiteSpaces(string str) {
  return Regex.Replace(str, @"\s+", String.Empty);
}

Extrait de: https://codereview.stackexchange.com/questions/64935/replace-each-whitespace-in-a-string-with-20

4

La réponse à cette question n'est pas aussi facile qu'il y paraît. Le problème n'est pas de coder le remplacement, mais de définir ce qu'est un espace blanc.

Par exemple, cet article Wikipedia répertorie des dizaines de caractères (points de code Unicode) dotés de l'attribut Unicode WSpace, ainsi que de nombreux caractères associés que la plupart des gens considèrent comme des espaces, mais qui n'ont pas d'attribut WSpace.

Cela étant dit, je ne me fierais jamais à ce que certains analyseurs syntaxiques de regex considèrent comme étant \s, car cela n’est en fait pas normalisé. Je suis tout à fait sûr que l'analyseur regex de C # ne traite pas les points de code comme U+2001 comme des espaces, de sorte qu'ils ne seront pas supprimés de votre chaîne.

Cela peut ou peut ne pas être un problème pour votre application; cela dépend de la manière dont les chaînes que vous devez gérer sont filtrées en premier lieu. Mais si vous allez gérer des chaînes en langues étrangères (en d’autres termes: chaînes contenant des caractères hors de la plage ASCII), vous devrez y réfléchir.

Ce faisant, gardez à l'esprit que les expressions rationnelles sont lentes. Si vous avez quand même besoin de définir vos propres remplacements (pour les raisons mentionnées ci-dessus), vous devez utiliser une fonction de remplacement plus légère (si C # ou ses assemblages en fournissent une - je n'utilise pas C #, donc je ne sais pas).

2
Binarus

Il suffit de passer la chaîne lors de l’appel à la méthode, elle renverra la chaîne sans espaces.

 public static string RemoveSpaces(this String Value)
    {
        RegexOptions options = RegexOptions.None;
        Regex regex = new Regex(@"[ ]{2,}", options);
        return regex.Replace(Value.Trim(), @" ");
    }
1
Veer Jangid

Pour tous ceux qui se rendent sur cette page, il existe un excellent article CodeProject dans lequel l'auteur compare plusieurs solutions différentes à ce problème. La solution entièrement gérée la plus rapide qu'il a proposée est (essentiellement) la suivante:

public static string RemoveAllWhitespace(string str) {
    var len = str.Length;
    var src = str.ToCharArray();
    var dstIdx = 0;
    for (var i = 0; i < len; i++) {
        var ch = src[i];
        switch (ch) {
            case '\u0020': case '\u00A0': case '\u1680': case '\u2000': case '\u2001':
            case '\u2002': case '\u2003': case '\u2004': case '\u2005': case '\u2006':
            case '\u2007': case '\u2008': case '\u2009': case '\u200A': case '\u202F':
            case '\u205F': case '\u3000': case '\u2028': case '\u2029': case '\u0009':
            case '\u000A': case '\u000B': case '\u000C': case '\u000D': case '\u0085':
                break;
            default:
                src[dstIdx++] = ch;
                break;
        }
    }
    return new string(src, 0, dstIdx);
}

Il y a bien sûr de nombreuses mises en garde et potentiellement des différences d'opinion sur ce qui est le jeu correct de caractères d'espacement, mais les informations de base sont très utiles (comme RegEx était de loin le plus lent).

Article complet ici: https://www.codeproject.com/Articles/1014073/Fastest-method-to-remove-all-whitespace-from-Strin

Remarque: je n'ai aucune affiliation avec l'auteur ou CodeProject. Je viens de trouver cet article par le biais d'une recherche Web normale.

1
Dave Parker
   string Abcd = Console.ReadLine();
        string wspace = "";
                    int len = Abcd.Length;
        for (int i = 0; i <= len-1; i++)
        {
            if (Abcd[i] != ' ')
            {
                wspace = wspace + Abcd[i];
            }

        }
        Console.WriteLine("The Sring Without Space Is= '"+wspace+"'");
        Console.ReadLine();
0
Shaharukh Pathan