Regex Pattern - Autorise les caractères alphanumériques, un ensemble de caractères spéciaux, mais pas une certaine séquence de caractères.

StackOverflow https://stackoverflow.com/questions/429719

  •  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à.

Était-ce utile?

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:

  1. 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; @:?! () $ # ^]
  2. 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 * .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top