Je suis complètement incapable d'expressions régulières et j'ai donc besoin d'aide pour résoudre un problème qui, à mon avis, serait mieux résolu en utilisant des expressions régulières.
J'ai une liste de chaînes en 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, "");
}
Je dois pouvoir parcourir la liste en boucle et renvoyer chaque élément sans caractères spéciaux. Par exemple, le premier élément serait "TRA9423", le deuxième élément serait "TRA42101" et le troisième serait TRA109AD.
Y at-il une expression régulière qui peut accomplir cela pour moi?
En outre, la liste contient plus de 4 000 éléments. J'ai donc besoin de la recherche et du remplacement pour être efficace et rapide si possible.
EDIT: J'aurais dû préciser que tout caractère autre que a-z, A-Z et 0-9 est spécial dans mon cas.
Cela dépend vraiment de votre définition des caractères spéciaux. Je trouve qu'une liste blanche plutôt qu'une liste noire est la meilleure approche dans la plupart des situations:
tmp = Regex.Replace(n, "[^0-9a-zA-Z]+", "");
Vous devez être prudent avec votre approche actuelle car les deux éléments suivants seront convertis dans la même chaîne et seront donc indiscernables:
"TRA-12:123"
"TRA-121:23"
Cela devrait le faire:
[^a-zA-Z0-9]
Fondamentalement, il correspond à tous les caractères non alphanumériques.
[^a-zA-Z0-9]
est une classe de caractères qui correspond à des caractères non alphanumériques.
Sinon, [^\w\d]
fait la même chose.
Usage:
string regExp = "[^\w\d]";
string tmp = Regex.Replace(n, regExp, "");
Vous pouvez utiliser:
string regExp = "\\W";
Ceci est équivalent à "[^a-zA-Z0-9]
" de Daniel
\ W correspond à n'importe quel caractère non-mot. Équivalent aux catégories Unicode [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]
.
Selon votre définition de "caractère spécial", je pense que "[^ a-zA-Z0-9]" ferait probablement l'affaire. Cela trouverait tout ce qui n'est pas une petite lettre, une lettre majuscule ou un chiffre.
tmp = Regex.Replace(n, @"\W+", "");
\w
correspond aux lettres, chiffres et traits de soulignement, \W
est la version annulée.
Pour mes besoins, je voulais tous les caractères anglais ASCII, donc cela a fonctionné.
html = Regex.Replace(html, "[^\x00-\x80]+", "")
Si vous ne souhaitez pas utiliser Regex, une autre option consiste à utiliser
char.IsLetterOrDigit
Vous pouvez utiliser ceci pour parcourir chaque caractère de la chaîne et ne renvoyer que si true.
public static string Letters(this string input)
{
return string.Concat(input.Where(x => char.IsLetter(x) && !char.IsSymbol(x) && !char.IsWhiteSpace(x)));
}