-2
votes

Expression régulière

Quelqu'un peut-il m'aider avec l'expression régulière qui

  1. ne doit pas contenir de 9 chiffres (123456789 ou 123-45-6789).
  2. devrait accepter le soulignement (_), un trait d'union (-), une période (.) ou un symbole (@).

    Actuellement, j'ai deux expressions régulières pour valider chaque étape séparément. Comment pouvons-nous combiner ces deux coditions

    1. ^ (((?! ([0-9] {3,3} - [0-9] {2,2} - [0-9] {4,4}) | [0-9] {9 }).) * $
    2. ^ [_-. @] + $

      Exemples:

      Cordes valides:

      1. Testuffer
      2. Testuser038
      3. Testuser038 @, testutilisateur @., testutilisateur, etc. (Toute combinaison de @ -_.)
      4. 038TESTUser

        Cordes non valides:

        1. TESTURE123456789
        2. 123456789
        3. 123-45-6789
        4. Testuser123-45-6789
        5. Testuffer ^ (Autres caractères spéciaux autres que (@ -_.))

8 commentaires

Essayez ^ (?!. * (?: [0-9] {3} - [0-9] {2} - [0-9] {4} | [0-9] {9})) . * [_. @ -]. * $ si la deuxième exigence est en réalité "la chaîne doit contenir l'un des quatre caractères spéciaux".


@ Wiktorstribiżew Cela n'a pas fonctionné. Exemple: Test @ 12345678 devrait accepter et tester @ 123456789 ne devrait pas accepter.


Donc, d'autres motifs avec 9 chiffres sont autorisés? Fondamentalement, tout modèle avec un nombre arbitraire de chiffres ainsi que ces caractères spéciaux autres que les deux motifs que vous avez mentionnés? Ou y a-t-il d'autres restrictions? Un minimum de chiffres? Caractères spéciaux après l'autre autorisé? Je suppose que ce que j'essaie de demander si vous pouvez élaborer un peu un peu sur ce que vous êtes après =)


Alors de quoi avez-vous besoin? . correspond déjà à des caractères de pause de charcuterie. ^ (?!. * (?: [0-9] {3} - [0-9] {2} - [0-9] {4} | [0-9] {9})). * $ devrait fonctionner pour vous (ou votre première regex).


@JVDV Strings valides: 1. Testuser 2. Testuser038 3. Testuser038 @, testutilisateur @ -45-6789 4. Testuer123-45-6789 5. Testuffer ^ (Autres caractères spéciaux autres que (@ - .))


Votre tentative de regex n'a même pas reflété de près ces spécificités. Veuillez mettre à jour votre question en conséquence pour que les utilisateurs proposent des réponses qui reflètent votre besoin réel. Voir Comment demander une question avec un exemple de reproductible minimal .


@JVDV Je viens de mettre à jour la question


Les deux réponses à ce jour ont interprété "ne doivent pas contenir de 9 chiffres" différemment. @Hans, avec sa plus belle regex, interprété cela signifie que la chaîne ne doit pas contenir "9 ou plusieurs chiffres", qui est la bonne interprétation littérale; Je suppose que vous vouliez dire que la chaîne ne doit pas contenir de "exactement 9 chiffres", basée en partie sur vos exemples. Malheureusement, une clarification rendrait une de nos réponses incorrectes. Je ne sais pas quoi, si quelque chose devait être fait dans cette situation.


3 Réponses :


1
votes

Vous pouvez valider la chaîne avec l'expression régulière suivante.

(?i)          : invoke case-indifferent mode
^             : match beginning of string       
(?!           : begin a negative lookahead
  [^\d\n]*    : match 0+ chars other than digits and newlines
  (?:         : begin non-capture group
    \d        : match a digit
    [^\d\n]*  : match 0+ chars other than digits and newlines
  )           : end non-capture group
  {9}         : execute non-capture group 9 times
  $           : match end of string
)             : end negative lookahead
[a-z\d_.@-]*  : match 0+ chars in character class
$             : match end of string


0 commentaires

1
votes
True: testUser
True: testUser038
True: testUser038@
True: testUser@.
True: testUser-
True: 038testUser
False: testUser123456789
False: 123456789
False: 123-45-6789
False: testUser123-45-6789
False: testUser^

1 commentaires

Merci cela a travaillé pour moi et cette excellente explication



1
votes

Utilisez la regex suivante: xxx

avec g , m et i options >

Détails:

  • ^ - début d'une ligne ( m option).
  • (? = - Démarrage de la lunette de lookame positive (cochez la ligne actuelle pour max. 8 chiffres, avec d'autres caractères autorisés avant / entre eux / après-les).
    • (?: - début d'un groupe de non-capture.
      • [-_. @ a-z] * - éventuellement séquence vide des caractères autorisés (aussi capital lettres) sauf des chiffres.
      • \ d - un chiffre.
      • ) {0,8} - Fin d'un groupe de non-capture, ce groupe peut survenir jusqu'à 8 fois.
      • [-_. @ A-Z] * - une autre séquence (éventuellement vide) de caractères autorisés sauf des chiffres (après le dernier chiffre autorisé).
      • $ - fin de ligne - aucun autre contenu autorisé dans la ligne en cours.
      • ) - fin de lunettes de vue positive.
      • [-_. @ a-z \ d] + - le contenu correspondant - une séquence non vide de caractères autorisés.
      • $ - fin de ligne.

        pour le mettre court:

        • Le lookahead positif vérifie max. 8 chiffres dans la ligne actuelle.
        • alors [...] correspond au contenu autorisé, jusqu'à la fin de la ligne.

          Remarque également une différence aussi importante pour votre regex: après [ (ouverture une classe de caractères) le premier Char est - , de sorte qu'il est traité littéralement . Vous mettez - au milieu , donc il agit comme "de - à" Condition (incorrect).

          pour un exemple de travail Voir: https: // regex101. com / r / ynijl4 / 1


0 commentaires