Ich möchte alle Sonderzeichen aus einer Zeichenkette entfernen. Erlaubte Zeichen sind A-Z (Groß- oder Kleinbuchstaben), Zahlen (0-9), Unterstrich (_) oder das Punktzeichen (.).
Ich habe das folgende, es funktioniert, aber ich vermute (ich weiß!), es ist nicht sehr effizient:
public static string RemoveSpecialCharacters(string str)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.Length; i++)
{
if ((str[i] >= '0' && str[i] <= '9')
|| (str[i] >= 'A' && str[i] <= 'z'
|| (str[i] == '.' || str[i] == '_')))
{
sb.Append(str[i]);
}
}
return sb.ToString();
}
Was ist der effizienteste Weg, dies zu tun? Wie würde ein regulärer Ausdruck aussehen, und wie sieht er im Vergleich zur normalen Zeichenkettenmanipulation aus?
Die zu bereinigenden Zeichenfolgen sind relativ kurz, in der Regel zwischen 10 und 30 Zeichen lang.
Nun, wenn Sie nicht wirklich die Leistung aus Ihrer Funktion herausquetschen müssen, nehmen Sie einfach das, was am einfachsten zu pflegen und zu verstehen ist. Ein regulärer Ausdruck würde wie folgt aussehen:
Um die Leistung zu erhöhen, können Sie ihn entweder vorkompilieren oder nur beim ersten Aufruf kompilieren lassen (nachfolgende Aufrufe sind dann schneller).
public static string RemoveSpecialCharacters(string str)
{
return Regex.Replace(str, "[^a-zA-Z0-9_.]+", "", RegexOptions.Compiled);
}
Ich schlage vor, eine einfache Nachschlagetabelle zu erstellen, die Sie im statischen Konstruktor initialisieren können, um eine beliebige Zeichenkombination auf gültig zu setzen. So können Sie eine schnelle, einmalige Prüfung durchführen.
edit
Um die Geschwindigkeit zu erhöhen, sollten Sie die Kapazität des StringBuilders auf die Länge der Eingabezeichenkette initialisieren. Dadurch werden Neuzuweisungen vermieden. Diese beiden Methoden zusammen bieten Ihnen sowohl Geschwindigkeit als auch Flexibilität.
andere Bearbeitung
Ich denke, der Compiler könnte es herausoptimieren, aber aus Gründen des Stils und der Effizienz empfehle ich foreach statt for.
Ich würde einen String Replace mit einem regulären Ausdruck verwenden, der nach "Sonderzeichen" sucht und alle gefundenen Zeichen durch einen leeren String ersetzt.