Regex Pattern - Autorise les caractères alphanumériques, un ensemble de caractères spéciaux, mais pas une certaine séquence de caractères.
-
06-07-2019 - |
Question
J'ai l'expression régulière suivante:
(?!^[&#]*$)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$
Donc, autoriser A-Z, a-Z, 0-9 et ces caractères spéciaux '., & amp; @:?! () $ # / \
Je ne veux PAS faire correspondre si le jeu de caractères suivant est rencontré n'importe où dans la chaîne dans cet ordre:
&#
Lorsque j'exécute cette expression rationnelle avec juste "& amp; #" en entrée, cela ne correspond pas à mon motif, j'obtiens une erreur, super. Lorsque je lance l'expression régulière avec ', & amp; @:?!! () $ # / \ ABC123
Cela correspond à mon modèle, pas d'erreur.
Cependant, lorsque je l'exécute avec:
'.,&#@:?!()$#/\ABC123
Cela ne commet pas d'erreur non plus. Je fais quelque chose de mal avec le contrôle de la séquence & amp #.
Quelqu'un peut-il me dire ce que j'ai mal fait, je ne suis pas très bon avec ces choses-là.
La solution
Pour emprunter une technique permettant de faire correspondre les chaînes entre guillemets, supprimez & amp;
de votre classe de caractères, ajoutez une alternative à & amp;
pas , suivi de < code> # et autorisez éventuellement la chaîne à se terminer par & amp;
:
^ ((?: [A-Za-z0-9 - '., @:?! () $ # / \\] + | & amp; [^ #]) * & amp;?) $
Autres conseils
Je le ferais réellement en deux parties:
- Vérifiez votre jeu de caractères autorisé. Pour ce faire, je rechercherais les caractères non autorisés et renverrais false s'il y a correspondance. Cela signifie que j'ai une belle expression simple:
[^ A-Za-z0-9 '\. & amp; @:?! () $ # ^]
- Vérifiez votre sous-chaîne interdite. Et puisqu'il ne s'agit que d'une sous-chaîne, je n'utiliserais probablement même pas de regex pour cette partie.
Vous n'avez pas mentionné votre langue, mais si en C #:
bool IsValid(string input)
{
return !( input.Contains("&#")
|| Regex.IsMatch(@"[^A-Za-z0-9'\.&@:?!()$#^]", input)
);
}
^ ((?! & # 0) [A-Za-z0-9 - ',, & amp; @:?! () $ # / \\]) * $
notez que le dernier \ est échappé (doublé)
SO transforme automatiquement \\
en \ si pas en pioche
En supposant que RegExp soit compatible avec Perl
Pour ne pas correspondre à la chaîne '& amp; #':
(?! [^ & amp;] * & amp; #) ^ ([A-Za-z0-9 - ',, & amp; @:?! () $ # / \\] *) $
Bien que vous n'ayez pas besoin de la parenthèse car vous correspondez à la chaîne entière.
Just FYI, bien que la regex de Ben Blank fonctionne, c'est plus compliqué qu'il ne le faut. Je le ferais comme ça:
^(?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&(?!#))+$
Comme j'ai utilisé un préfixe négatif au lieu d'une classe de caractères annulée, l'expression régulière n'a besoin d'aucune aide supplémentaire pour faire correspondre une esperluette à la fin de la chaîne.
Je recommanderais d'utiliser deux expressions régulières dans une condition:
if (string has sequence "&#")
return false
else
return (string matches sequence "A-Za-z0-9-'.,&@:?!()$#/\")
Je crois que votre deuxième " main " regex de
^([A-Za-z0-9-'.,&@:?!()$#/\])^[A-Za-z0-9-'.,&@:?!()$#/\\]+$
quot;
a plusieurs erreurs:
- Il ne testera qu'un seul caractère de votre ensemble
- Le caractère
\
dans les expressions régulières est un jeton indiquant que le caractère suivant fait partie d'une sorte de "classe". de caractères (ex.\ n
= est le caractère de saut de ligne). La séquence de caractères\]
fait en sorte que votre liste entre crochets ne soit pas terminée.
Vous ferez peut-être mieux d'utiliser
<*>Notez que la barre oblique est représentée par une double barre oblique.
Le caractère +
indique qu'au moins un caractère testé doit correspondre à l'expression régulière; s'il convient de passer une chaîne de longueur nulle, remplacez le +
par un *
.