Wie entferne ich alle nicht alphanumerischen Zeichen mit Ausnahme von Bindestrich und Leerzeichen aus einer Zeichenfolge?
Für das von Ihnen angeführte Beispiel wäre es auch nützlich, wenn Sie die Ergebnisse der einzelnen Methoden angeben würden.
Wie entferne ich alle nicht alphanumerischen Zeichen mit Ausnahme von Bindestrich und Leerzeichen aus einer Zeichenfolge?
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();
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.
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))); }
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);
}
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!
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 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.