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?

1101voto

Amarghosh Punkte 56804

Ersetzen Sie [^a-zA-Z0-9 -] mit einer leeren Zeichenkette.

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

101 Stimmen

Es ist erwähnenswert, dass - muss am Ende der Zeichenklasse stehen oder mit einem Backslash versehen sein, damit es nicht für einen Bereich verwendet wird.

0 Stimmen

Ich bin mit klassischen ASP (nicht C#, wie die ursprüngliche Frage markiert ist) - wenn ich eingeben: 50025454$ funktioniert dies gut, aber wenn ich 50025454$$ eingebe, schlägt dies fehl. (Ich muss der Regex ein + hinzufügen). Ist dies das gleiche in C#?

0 Stimmen

Allerdings schlägt die Verwendung von Regex rgx = new Regex("[^a-zA-Z0-9 -]+") und der Versuch 5002$5454$ immer noch fehl.

400voto

ata Punkte 8605

Ich hätte auch RegEx verwenden können, die zwar eine elegante Lösung bieten, aber auch zu Leistungsproblemen führen können. 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 nicht über FindAll verfügt)

Ersetzen Sie FindAll durch 1

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

str = new string(arr);

1 Kommentar von ShawnFeatherly

48 Stimmen

In meinen Tests war diese Technik viel schneller. Um genau zu sein, war sie knapp 3 Mal schneller als die Regex-Ersetzungs-Technik.

14 Stimmen

Das kompakte Framework verfügt nicht über FindAll, Sie können FindAll ersetzen durch char[] arr = str.Where(c => (char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-')).ToArray();

2 Stimmen

Hat dies jemand getestet? Das hat überhaupt nicht funktioniert. -aber das hat bei mir funktioniert: string str2 = new string(str.Where(c => (char.IsLetterOrDigit(c))).ToArray());

81voto

josephj1989 Punkte 9171

Sie können es versuchen:

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

Wo s ist Ihre Zeichenkette.

1 Stimmen

OP fragte nach dem Bindestrich, nicht nach dem Unterstrich

1 Stimmen

Dies funktioniert nicht, da es einen "Symbol nicht gefunden"-Fehler gibt, selbst nach dem Import von java.util.regex.*

13 Stimmen

@DavidBandel es ist C#

51voto

Zain Ali Punkte 14857

System.Linq verwenden

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

0 Stimmen

@Michael Es ist ähnlich, aber zumindest ist es ein Einzeiler und nicht 3 Zeilen. Ich würde sagen, das ist genug, um es zu einer anderen Antwort zu machen.

1 Stimmen

@Dymas Ich stimme jetzt zu, dass es akzeptabel ist, aber pas weil die Leerzeichen anders sind. Offenbar wurde der Teil, der funktional gleichwertig ist (nur die Vari-Namen unterscheiden sich), nach dem Verfassen dieser Antwort bearbeitet.

1 Stimmen

@ZainAli, wenn Sie eine triviale Änderung vornehmen und mich anpingen, werde ich meine Ablehnung zurücknehmen. Ich entschuldige mich für jede Unterstellung von Plagiaten.

32voto

True Soft Punkte 8496

Die Regex lautet [^\w\s\-]* :

\s ist besser anstelle des Leerzeichens ( ), da sich im Text ein Tabulator befinden könnte.

2 Stimmen

Es sei denn, Sie wollen Tabs entfernen.

0 Stimmen

...und Zeilenumbrüche sowie alle anderen Zeichen, die als "Leerzeichen" gelten.

9 Stimmen

Diese Lösung ist den oben genannten Lösungen weit überlegen, da sie auch internationale (nicht-englische) Zeichen unterstützt. <!-- Sprache: c# --> string s = "Mötley Crue : und Kanji und Hiragana "; string r = Regex.Replace(s,"[^ \\w\\s -]*",""); Das obige Ergebnis ist r mit: Mötley Crue und Kanji und Hiragana

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