web-dev-qa-db-fra.com

Expression régulière pour exclure les caractères spéciaux

Je ne parviens pas à trouver une expression régulière qui répertorierait essentiellement certains caractères spéciaux.

Je dois l'utiliser pour valider les données dans les champs de saisie (dans une application Web Java). Nous voulons permettre aux utilisateurs d'entrer n'importe quel chiffre, lettre (nous devons inclure des caractères accentués, par exemple français ou allemand) et des caractères spéciaux tels que '-. etc. 

Comment puis-je lister des personnages tels que <>% $ etc?

Toute aide serait grandement appréciée. 

29
Ana

Je voudrais juste la liste blanche des personnages.

^[a-zA-Z0-9äöüÄÖÜ]*$

Construire une liste noire est tout aussi simple avec regex mais vous devrez peut-être ajouter beaucoup plus de caractères - il y a beaucoup de symboles chinois dans unicode ...

^[^<>%$]*$

L'expression [^ (beaucoup de caractères ici)] correspond à tout caractère non répertorié.

36
Daniel Brückner

Pour exclure certains caractères (<,>,% et $), vous pouvez créer une expression régulière comme celle-ci:

[<>%\$]

Cette expression régulière correspond à toutes les entrées comportant un caractère sur liste noire. Les crochets définissent une classe de caractères et le\est nécessaire avant le signe dollar car celui-ci a une signification particulière dans les expressions régulières.

Pour ajouter plus de caractères à la liste noire, il suffit de les insérer entre crochets; l'ordre n'a pas d'importance.

Selon certains la documentation Java pour les expressions régulières , vous pourriez utiliser l’expression suivante:

Pattern p = Pattern.compile("[<>%\$]");
Matcher m = p.matcher(unsafeInputString);
if (m.matches())
{
    // Invalid input: reject it, or remove/change the offending characters.
}
else
{
    // Valid input.
}
7
David Grayson

Il est généralement préférable de mettre en liste blanche les caractères que vous autorisez plutôt que de les mettre en liste noire. à la fois du point de vue de la sécurité et du point de vue de la facilité de mise en œuvre.

Si vous suivez la route de la liste noire, voici un exemple, mais soyez averti, la syntaxe n’est pas simple.

http://groups.google.com/group/regex/browse_thread/thread/0795c1b958561a07

Si vous souhaitez ajouter tous les caractères d’accent à la liste blanche, l’utilisation de plages unicode vous aiderait peut-être? Découvrez ce lien.

http://www.regular-expressions.info/unicode.html

5
Jason Coyne

Je suppose que cela dépend de la langue que vous ciblez. En général, quelque chose comme ceci devrait marcher:

[^<>%$]

La construction "[]" définit une classe de caractères, qui correspondra à n’importe lequel des caractères répertoriés. Mettre "^" en tant que premier caractère annule la correspondance, c'est-à-dire: tout caractère AUTRE que l'un de ceux énumérés.

Il se peut que vous deviez échapper certains caractères du "[]", en fonction du moteur de langage/moteur regex que vous utilisez.

4
KarstenF

Même en 2009, il semble que trop d'entre eux aient eu une idée très limitée de ce que la conception pour le Web DANS LE MONDE impliquait. En 2015, à moins de créer pour un pays spécifique, une liste noire est le seul moyen de prendre en compte le grand nombre de caractères pouvant être valides.

Les caractères de la liste noire doivent ensuite être choisis en fonction de ce qui est illégal pour lequel les données sont requises.

Cependant, il est parfois utile de décomposer les exigences et de les traiter séparément. Ici, regarde en avant, c'est ton ami. Ce sont des sections liées par (?=) pour positif et (?!) pour négatif, et deviennent effectivement des blocs AND, car lorsque le bloc est traité, en l'absence d'échec, le processeur regex commence au début du texte avec le bloc suivant. Effectivement, chaque bloc de recherche sera précédé du ^, et si son motif est glouton, incluez-le jusqu'au $. Même l'ancien moteur de regex VB6/VBA (Office) 5.5 prend en charge l'anticipation.

Ainsi, pour créer une expression régulière complète, commencez par les blocs de prévisualisation, puis ajoutez le bloc de caractères en liste noire avant le $ final.

Par exemple, pour limiter le nombre total de caractères, par exemple entre 3 et 15 inclus, commencez par le bloc d'anticipation positif (?=^.{3,15}$). Notez que cela nécessitait ses propres ^ et $ pour garantir la couverture de tout le texte.

Bien que vous souhaitiez peut-être autoriser les opérations _ et -, vous ne voudrez peut-être pas commencer ou terminer par eux. Vous devez donc ajouter les deux blocs de prévision négatifs, (?![_-].+) pour les débuts et (?!.+[_-]$) pour les fins.

Si vous ne souhaitez pas utiliser plusieurs _ et -, ajoutez un bloc d'anticipation négatif de (?!.*[_-]{2,}). Cela exclura également les séquences _- et -_.

S'il n'y a plus de blocs d'anticipation, ajoutez le bloc de liste noire avant le $, tel que [^<>[\]{\}|\\\/^~%# :;,$%?\0-\cZ]+, où \0-\cZ exclut les caractères nuls et les caractères de contrôle, y compris NL (\n) et CR (\r). Le + final garantit que tout le texte est inclus avec gourmandise.

Au sein du domaine Unicode, il peut également y avoir d’autres points de code ou blocs à exclure, mais certainement beaucoup moins que tous les blocs devant figurer dans une liste blanche.

La regex entière de tout ce qui précède serait alors

(?=^.{3,15}$)(?![_-].+)(?!.+[_-]$)(?!.*[_-]{2,})[^<>[\]{}|\\\/^~%# :;,$%?\0-\cZ]+$

que vous pouvez consulter en direct sur https://regex101.com/ , pour les moteurs pcre (php), javascript et regex python. Je ne sais pas où la regex Java convient, mais vous devrez peut-être modifier la regex pour tenir compte de ses particularités.

Si vous voulez inclure des espaces, mais pas _, échangez-les simplement dans la regex.

L'application la plus utile pour cette technique concerne l'attribut pattern pour les champs HTML input, dans lesquels une seule expression est requise, renvoyant la valeur false en cas d'échec, rendant ainsi le champ invalide, permettant à input:invalid css de le mettre en surbrillance et arrêtant le formulaire soumis.

3
Patanjali

L'ensemble négatif de tout ce qui n'est pas alphanumérique et de soulignement pour les caractères ASCII: 

/[^\W]/g

Pour la validation du courrier électronique ou du nom d'utilisateur, j'ai utilisé l'expression suivante qui autorise 4 caractères spéciaux standard - _. @ 

/^[-.@_a-z0-9]+$/gi

Pour une expression strictement alphanumérique uniquement, utilisez:

/^[a-z0-9]+$/gi

Test @ RegExr.com

2
mcgraw

Voulez-vous vraiment ajouter des personnages spécifiques à la liste noire ou plutôt les ajouter aux personnages autorisés?

Je suppose que vous voulez réellement ce dernier. C'est assez simple (ajoutez des symboles supplémentaires à la liste blanche dans le groupe [\-]):

^(?:\p{L}\p{M}*|[\-])*$

Edit: Optimisé le motif avec l'entrée des commentaires

2
Lucero

Voici tous les caractères accentués français: À.

Je voudrais google une liste de caractères accentués allemands. Il n'y en a pas beaucoup. Vous devriez pouvoir tous les avoir. 

Pour les URL, je remplace les URL accentuées par des lettres ordinaires, comme suit:

string beforeConversion = "àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇ’ñ";
string afterConversion = "aAaAaAaAeEeEeEeEiIiIiIoOoOoOuUuUuUcC'n";
for (int i = 0; i < beforeConversion.Length; i++) {

     cleaned = Regex.Replace(cleaned, beforeConversion[i].ToString(), afterConversion[i].ToString());
}

Il y a probablement un moyen plus efficace, remarquez.

1
Armstrongest

Pourquoi considérez-vous que regex est le meilleur outil pour cela? Si votre but est de détecter si un caractère illégal est présent dans une chaîne, tester chaque caractère dans une boucle sera à la fois plus simple et plus efficace que de construire une expression régulière.

1
DJClayworth

Utilisez celui-ci 

^ (? = [a-zA-Z0-9 ~ @ # $ ^ () _ + = [] {} | \,.?: -) $) (?!. * [<> '"/;`%])

1
Dharmender Tuli

Je soupçonne fortement qu'il sera plus facile de dresser une liste des caractères autorisés par ARE par rapport à ceux qui ne le sont pas - et une fois que vous avez cette liste, la syntaxe de l'expression régulière devient assez simple. Alors inscrivez-moi comme un autre vote pour "liste blanche".

0
BlairHippo