it-swarm.com.de

Regex, um alle Sonderzeichen aus Zeichenfolge zu entfernen?

Ich bin völlig unfähig zu regulären Ausdrücken und brauche daher Hilfe bei einem Problem, das meiner Meinung nach am besten durch reguläre Ausdrücke gelöst werden könnte.

Ich habe eine Liste von Zeichenketten in C #:

List<string> lstNames = new List<string>();
lstNames.add("TRA-94:23");
lstNames.add("TRA-42:101");
lstNames.add("TRA-109:AD");

foreach (string n in lstNames) {
  // logic goes here that somehow uses regex to remove all special characters
  string regExp = "NO_IDEA";
  string tmp = Regex.Replace(n, regExp, "");
}

Ich muss in der Lage sein, die Liste zu durchlaufen und jedes Element ohne Sonderzeichen zurückzugeben. Das erste Element wäre beispielsweise "TRA9423", das zweite Element wäre "TRA42101" und das dritte Element wäre TRA109AD. 

Gibt es einen regulären Ausdruck, der dies für mich erreichen kann?

Außerdem enthält die Liste mehr als 4000 Elemente. Ich muss also suchen und ersetzen, um möglichst effizient und schnell zu sein.

EDIT: Ich hätte angeben sollen, dass jedes Zeichen neben a-z, A-Z und 0-9 in meinen Umständen besonders ist.

57
Jagd

Es hängt wirklich von Ihrer Definition von Sonderzeichen ab. Ich finde, dass eine Whitelist und keine Blacklist in den meisten Situationen der beste Ansatz ist:

tmp = Regex.Replace(n, "[^0-9a-zA-Z]+", "");

Sie sollten mit Ihrem derzeitigen Ansatz vorsichtig sein, da die folgenden zwei Elemente in dieselbe Zeichenfolge konvertiert werden und daher nicht unterscheidbar sind:

"TRA-12:123"
"TRA-121:23"
99
Mark Byers

Das sollte es tun:

[^a-zA-Z0-9]

Grundsätzlich entspricht es allen nicht-alphanumerischen Zeichen.

16
Daniel Egeberg

[^a-zA-Z0-9] ist eine Zeichenklasse, die nicht alphanumerischen Zeichen entspricht.

Alternativ macht [^\w\d] dasselbe.

Verwendungszweck:

string regExp = "[^\w\d]";
string tmp = Regex.Replace(n, regExp, "");
16
MikeD

Sie können verwenden:

string regExp = "\\W";

Dies ist äquivalent zu Daniels "[^a-zA-Z0-9]"

\ W entspricht einem beliebigen Nichtwortzeichen. Entspricht den Unicode-Kategorien [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}].

8
Dan Diplo

Abhängig von Ihrer Definition von "Sonderzeichen" würde "[^ a-zA-Z0-9]" meiner Meinung nach wahrscheinlich den Trick erfüllen. Das würde alles finden, das kein Kleinbuchstabe, ein Großbuchstabe oder eine Ziffer ist.

3
Jay
tmp = Regex.Replace(n, @"\W+", "");

\w entspricht Buchstaben, Ziffern und Unterstrichen, \W ist die negierte Version.

2
Paul Creasey

Für meine Zwecke wollte ich alle englischen ASCII - Zeichen, also hat dies funktioniert.

html = Regex.Replace(html, "[^\x00-\x80]+", "")
2
BobC

Wenn Sie Regex nicht verwenden möchten, verwenden Sie eine andere Option

char.IsLetterOrDigit

Sie können dies verwenden, um jedes Zeichen der Zeichenfolge zu durchlaufen und nur bei true zurückzugeben.

0
Demarily
public static string Letters(this string input)
{
    return string.Concat(input.Where(x => char.IsLetter(x) && !char.IsSymbol(x) && !char.IsWhiteSpace(x)));
}
0
user1883961