it-swarm.com.de

Wie entferne ich alle nicht alphanumerischen Zeichen aus einer Zeichenfolge mit Ausnahme des Bindestrichs?

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

554
Luke101

Ersetzen Sie [^a-zA-Z0-9 -] durch eine leere Zeichenfolge.

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

Ich hätte RegEx verwenden können, sie können eine elegante Lösung bieten, aber sie können performante Probleme verursachen. Hier ist eine Lösung

char[] arr = str.ToCharArray();

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

Bei Verwendung des kompakten Frameworks (das FindAll nicht enthält)

Ersetzen Sie FindAll durch1

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

str = new string(arr);

1 Kommentar von ShawnFeatherly

338
ata

Du kannst es versuchen:

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

Wobei s Ihre Zeichenfolge ist.

42
josephj1989

Verwenden von System.Linq

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

Der reguläre Ausdruck ist [^\w\s\-]*:

\s ist besser als Leerzeichen () zu verwenden, da sich möglicherweise ein Tabulator im Text befindet.

20
True Soft

Basierend auf der Antwort auf diese Frage habe ich eine statische Klasse erstellt und diese hinzugefügt. 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 verwendet werden als:

string example = "[email protected]#$";
string alphanumeric = example.ToAlphaNumericOnly();
string alpha = example.ToAlphaOnly();
string numeric = example.ToNumericOnly();
12
Ppp

Ich habe eine andere Lösung gefunden, indem ich die Control -Zeichen eliminiert habe, 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 denke ich es ist besser!

4
Pinello

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

Auf diese Weise können Sie angeben, welche Zeichen Sie ebenfalls zulassen möchten.

4

Hier ist eine nicht-reguläre schnelle Lösung für die Heap-Zuweisung, die genau das war, wonach ich gesucht habe.

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 keine unsicheren oder nicht vertrauenswürdigen Zeichenfolgen verwenden möchten.

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

Hier ist eine Erweiterungsmethode, die @ ata als Inspiration verwendet.

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

oder wenn Sie andere Zeichen als 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);
    }
}
1
Aaron Hudon

Ich verwende hier eine Variante einer der Antworten. Ich möchte Leerzeichen durch "-" ersetzen, damit es SEO-freundlich ist und auch Kleinbuchstaben macht. Verweisen Sie auch nicht auf system.web aus meiner Dienstschicht.

private string MakeUrlString(string input)
{
    var array = input.ToCharArray();

    array = Array.FindAll<char>(array, c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-');

    var newString = new string(array).Replace(" ", "-").ToLower();
    return newString;
}
1
Philip Johnson