Question Comment puis-je supprimer tous les caractères non alphanumériques d'une chaîne à l'exception du tiret?


Comment puis-je supprimer tous les caractères non alphanumériques d'une chaîne à l'exception des caractères dash et espace?


478
2017-07-09 06:45


origine


Réponses:


Remplacer [^a-zA-Z0-9 -] avec une chaîne vide.

Regex rgx = new Regex("[^a-zA-Z0-9 -]");
str = rgx.Replace(str, "");

682
2017-07-09 06:50



J'aurais pu utiliser RegEx, ils peuvent fournir une solution élégante mais ils peuvent causer des problèmes performants. Voici une solution

char[] arr = str.ToCharArray();

arr = Array.FindAll<char>(arr, (c => (char.IsLetterOrDigit(c) 
                                  || char.IsWhiteSpace(c) 
                                  || c == '-')));
str = new string(arr);

Lors de l'utilisation de l'infrastructure compacte (qui n'a pas FindAll)

Remplacer FindAll avec1

char[] arr = str.Where(c => (char.IsLetterOrDigit(c) || 
                             char.IsWhiteSpace(c) || 
                             c == '-')).ToArray(); 

str = new string(arr);

1  Commentaire de ShawnFeatherly


312
2017-07-09 07:00



Tu peux essayer:

   string s1= Regex.Replace(s,"[^A-Za-z0-9 _]","");

s c'est ta chaîne


39
2017-07-09 06:55



Utilisation de System.Linq

string withOutSpecialCharacters = new string(stringWithSpecialCharacters.Where(c =>char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-').ToArray());

32
2018-03-01 04:20



La regex est [^\w\s\-]*:

\s est préférable d'utiliser au lieu de l'espace (), car il pourrait y avoir un onglet dans le texte.


18
2017-07-09 06:55



Sur la base de la réponse à cette question, j'ai créé une classe statique et ajouté ces derniers. Pensé que cela pourrait être utile pour certaines personnes.

public static class RegexConvert
{
    public static string ToAlphaNumericOnly(this string input)
    {
        Regex rgx = new Regex("[^a-zA-Z0-9]");
        return rgx.Replace(input, "");
    }

    public static string ToAlphaOnly(this string input)
    {
        Regex rgx = new Regex("[^a-zA-Z]");
        return rgx.Replace(input, "");
    }

    public static string ToNumericOnly(this string input)
    {
        Regex rgx = new Regex("[^0-9]");
        return rgx.Replace(input, "");
    }
}

Ensuite, les méthodes peuvent être utilisées comme:

string example = "asdf1234!@#$";
string alphanumeric = example.ToAlphaNumericOnly();
string alpha = example.ToAlphaOnly();
string numeric = example.ToNumericOnly();

12
2017-11-26 02:22



J'ai fait une solution différente, en éliminant le Contrôle caractères, ce qui était mon problème original.

Il vaut mieux que de mettre dans une liste tous les caractères "spéciaux mais bons"

char[] arr = str.Where(c => !char.IsControl(c)).ToArray();    
str = new string(arr);

c'est plus simple, donc je pense que c'est mieux!


4
2017-10-31 13:23



Voulez-vous quelque chose rapidement?

public static class StringExtensions 
{
    public static string ToAlphaNumeric(this string self, params char[] allowedCharacters)
    {
        return new string(Array.FindAll(self.ToCharArray(), c => char.IsLetterOrDigit(c) || allowedCharacters.Contains(c)));
    }
}

Cela vous permettra également de spécifier les caractères que vous souhaitez autoriser.


2
2017-08-16 12:59



Voici une solution rapide et conviviale d'allocation de tas sans regex, que je cherchais.

Édition dangereuse.

public static unsafe void ToAlphaNumeric(ref string input)
{
    fixed (char* p = input)
    {
        int offset = 0;
        for (int i = 0; i < input.Length; i++)
        {
            if (char.IsLetterOrDigit(p[i]))
            {
                p[offset] = input[i];
                offset++;
            }
        }
        ((int*)p)[-1] = offset; // Changes the length of the string
        p[offset] = '\0';
    }
}

Et pour ceux qui ne veulent pas utiliser dangereux ou ne font pas confiance au hack de longueur de chaîne.

public static string ToAlphaNumeric(string input)
{
    int j = 0;
    char[] newCharArr = new char[input.Length];

    for (int i = 0; i < input.Length; i++)
    {
        if (char.IsLetterOrDigit(input[i]))
        {
            newCharArr[j] = input[i];
            j++;
        }
    }

    Array.Resize(ref newCharArr, j);

    return new string(newCharArr);
}

1
2018-01-26 18:19