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.
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"
Das sollte es tun:
[^a-zA-Z0-9]
Grundsätzlich entspricht es allen nicht-alphanumerischen Zeichen.
[^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, "");
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}]
.
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.
tmp = Regex.Replace(n, @"\W+", "");
\w
entspricht Buchstaben, Ziffern und Unterstrichen, \W
ist die negierte Version.
Für meine Zwecke wollte ich alle englischen ASCII - Zeichen, also hat dies funktioniert.
html = Regex.Replace(html, "[^\x00-\x80]+", "")
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.
public static string Letters(this string input)
{
return string.Concat(input.Where(x => char.IsLetter(x) && !char.IsSymbol(x) && !char.IsWhiteSpace(x)));
}