web-dev-qa-db-fra.com

Regex pour supprimer tous les caractères spéciaux de la chaîne?

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.

57
Jagd

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"
99
Mark Byers

Cela devrait le faire:

[^a-zA-Z0-9]

Fondamentalement, il correspond à tous les caractères non alphanumériques.

16
Daniel Egeberg

[^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, "");
16
MikeD

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}].

8
Dan Diplo

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.

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

\w correspond aux lettres, chiffres et traits de soulignement, \W est la version annulée.

2
Paul Creasey

Pour mes besoins, je voulais tous les caractères anglais ASCII, donc cela a fonctionné.

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

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.

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