73 votes

Comment supprimer la ponctuation d'une chaîne de caractères ?

Pour la partie de cette question qui vise à obtenir une réponse en 30 secondes, je recherche spécifiquement du C#.

Mais dans le cas général, quelle est la meilleure façon de supprimer la ponctuation dans n'importe quelle langue ?

Je devrais ajouter : Idéalement, les solutions ne vous demanderont pas d'énumérer tous les signes de ponctuation possibles.

En rapport : Suppression de la ponctuation en Python

0 votes

Les différentes langues sont, en fait, différentes, et je ne pense pas qu'il y ait une réponse à la question que vous posez. Vous pourriez vous renseigner sur des langages spécifiques, ou sur le langage qui serait le plus adapté à ce genre de manipulation.

117voto

GWLlosa Points 10701
new string(myCharCollection.Where(c => !char.IsPunctuation(c)).ToArray());

1 votes

Ouaip. Il alimente l'opération en chaîne que j'ai postée ci-dessous.

10 votes

LinQ ne cesse de m'étonner.

0 votes

Brillant. Moins, c'est plus.

23voto

Hades32 Points 428

Pourquoi pas simplement :

string s = "sxrdct?fvzguh,bij.";
var sb = new StringBuilder();

foreach (char c in s)
{
   if (!char.IsPunctuation(c))
      sb.Append(c);
}

s = sb.ToString();

L'utilisation de RegEx est normalement plus lente que les simples opérations char. Et ces opérations LINQ me semblent exagérées. Et vous ne pouvez pas utiliser un tel code dans .NET 2.0...

0 votes

Notez que cette approche vous permet également de remplacer la ponctuation par (par exemple) des espaces blancs. Utile pour la tokénisation.

15voto

Brian Low Points 3642

Décrit l'intention, le plus facile à lire (IMHO) et le plus performant :

 s = s.StripPunctuation();

à mettre en œuvre :

public static class StringExtension
{
    public static string StripPunctuation(this string s)
    {
        var sb = new StringBuilder();
        foreach (char c in s)
        {
            if (!char.IsPunctuation(c))
                sb.Append(c);
        }
        return sb.ToString();
    }
}

Il s'agit de l'algorithme d'Hades32, qui était le plus performant de tous ceux qui ont été postés.

0 votes

Remarque intéressante : les éléments suivants ne sont pas des signes de ponctuation : $^+|<>=

14voto

Joachim Sauer Points 133411

En supposant que "meilleur" signifie "le plus simple", je suggère d'utiliser quelque chose comme ceci :

String stripped = input.replaceAll("\\p{Punct}+", "");

Cet exemple est pour Java, mais tous les moteurs Regex suffisamment modernes devraient le supporter (ou quelque chose de similaire).

Edit : la version compatible avec Unicode serait la suivante :

String stripped = input.replaceAll("\\p{P}+", "");

La première version ne prend en compte que les caractères de ponctuation contenus dans l'ASCII.

1 votes

Le C# ne dispose pas de l'option Punct mais elle possède P

9voto

Anton Points 670

Vous pouvez utiliser la méthode regex.replace :

 replace(YourString, RegularExpressionWithPunctuationMarks, Empty String)

Puisque cette méthode renvoie une chaîne de caractères, elle ressemblera à ceci :

 string s = Regex.Replace("Hello!?!?!?!", "[?!]", "");

Vous pouvez remplacer "[ ?!]" par quelque chose de plus sophistiqué si vous le souhaitez :

(\p{P})

Cela devrait permettre de trouver toute ponctuation.

0 votes

+1 pour l'utilisation d'une classe de caractères unicode. Concis, précis et agréable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X