785 Stimmen

Wie entferne ich alle nicht alphanumerischen Zeichen außer dem Bindestrich aus einer Zeichenfolge?

Wie entferne ich alle nicht alphanumerischen Zeichen mit Ausnahme von Bindestrich und Leerzeichen aus einer Zeichenfolge?

25voto

Ppp Punkte 925

Auf der Grundlage der Antwort auf diese Frage habe ich eine statische Klasse erstellt und diese hinzugefügt. Ich dachte, es könnte für einige Leute nützlich sein.

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, "");
    }
}

Dann können die Methoden als verwendet werden:

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

2 Stimmen

Für das von Ihnen angeführte Beispiel wäre es auch nützlich, wenn Sie die Ergebnisse der einzelnen Methoden angeben würden.

0 Stimmen

Diese Lösung ist kulturabhängig.

20voto

Zachare Sylvestre Punkte 281

Sie wollen etwas Schnelles?

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)));
    }
}

So können Sie angeben, welche Zeichen Sie zulassen möchten.

0 Stimmen

IMHO ist dies die beste Lösung.

0 Stimmen

Sieht sauber aus, aber es ist ein bisschen schwierig zu spezifizieren, wie man weißen Raum hinzufügt? Ich hätte eine weitere Überladung hinzugefügt, die auch Leerzeichen zulässt, da diese Methode gut bei Wörtern funktioniert, aber nicht bei Sätzen oder anderen Leerzeichen wie Zeilenumbrüchen oder Tabulatoren. +1 Wie auch immer, gute Lösung. public static string ToAlphaNumericWithWhitespace(this string self, params char[] allowedCharacters) { return new string(Array.FindAll(self.ToCharArray(), c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || allowedCharacters.Contains(c))); }

7voto

BjarkeCK Punkte 5537

Hier ist eine nicht-Regex Heap-Allokation freundliche schnelle Lösung, die war, was ich suchte.

Unsichere Ausgabe.

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';
    }
}

Und für diejenigen, die unsafe nicht verwenden wollen oder dem Stringlängen-Hack nicht trauen.

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);
}

0 Stimmen

Sie sollten den Inhalt der Zeichenkette wegen des String-Poolings nicht verändern.

4voto

Pinello Punkte 41

Ich habe eine andere Lösung gefunden, indem ich die Kontrolle Zeichen, was mein ursprüngliches Problem war.

Es ist besser, als alle "besonderen, aber guten" Zeichen in eine Liste aufzunehmen.

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

Es ist einfacher, also ist es meiner Meinung nach besser!

3voto

Aaron Hudon Punkte 4338

Hier ist eine Erweiterungsmethode mit @ata Antwort als Inspiration.

"hello-world123, 456".MakeAlphaNumeric(new char[]{'-'});// yields "hello-world123456"

oder wenn Sie andere Zeichen als den Bindestrich benötigen...

"hello-world123, 456!?".MakeAlphaNumeric(new char[]{'-','!'});// yields "hello-world123456!"

public static class StringExtensions
{   
    public static string MakeAlphaNumeric(this string input, params char[] exceptions)
    {
        var charArray = input.ToCharArray();
        var alphaNumeric = Array.FindAll<char>(charArray, (c => char.IsLetterOrDigit(c)|| exceptions?.Contains(c) == true));
        return new string(alphaNumeric);
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X