2017-04-22 5 views
0

J'essaie de trouver le REGEX pour ce code de produit particulier.Comment exclure 2 caractère alphabétique d'une chaîne dans REGEX

Description:

  1. Un code produit valide doit commencer par un des deux nombres de chiffres.
  2. Le nombre ne peut commencer par 0
  3. Le nombre doit être suivi d'un trait d'union -
  4. Le trait d'union est suivie d'une séquence de lettres majuscules conformes aux modèles AAA et BBB
  5. AAA: chaîne de tous les trois caractères alphabétiques majuscules à l'exception de « I » et « O »
  6. chaîne BBB de tous les caractères alphabétiques trois majuscules dans la gamme « A » à « D »

Exemples:

  • N-AAA

  • NN-AAA

  • NN-BBB

  • NN-AAABBB

Mon problème est avec le point 5) I mentionné. Ma solution à ce jour est:

^[1-9] [0-9] - [AZ] [^ IO] {3} [AD] {3} $

Je ne suis pas? sûr de la partie que j'ai mis en évidence dans mon RE. Je cherche à savoir si ma solution est correcte et si ce n'est pas le cas, j'aimerais connaître la réponse et le raisonnement qui la sous-tend.

Merci,

+0

Il est inexact, puisque '[^ IO]' matches * tout * ombles mais '' î' et O'. Aussi, pourquoi avez-vous ajouté '{#}'? Et si vous vouliez dire un trait d'union après un nombre, pourquoi utiliser '.'? Donc, «AAA» et «BBB» sont des séquences de trois lettres chacune? Eh bien, vos exigences ne sont pas claires. Essayez ['^ [1-9] [0-9]? - (?: (?! [IO]) [AZ]) {3} (?: [AD] {3})? $'] (Https: //regex101.com/r/lhJAgI/1). –

+0

Utilisez-vous flex? (Sinon, pourquoi signaler la question [compiler-construction]?) En outre, vos exemples semblent suggérer que le nombre peut être suivi par AAA ou BBB ou les deux. Mais ce n'est pas ce que dit votre description. – rici

+0

Quel langage de programmation utilisez-vous? –

Répondre

0

Vous devez utiliser Lookahead négatif(?!([I]|[O])) dans votre Regex.S'il vous plaît vérifier:

^[1-9]{1}[0-9]+\-(?!([I]|[O]))[A-Z]{3}[A-D]{3} 

Ancienne Mise à jour:

^[1-9]{1}[0-9]+\-((?!([I]|[O]))[A-Z]{3}[A-D]{3}|(?!([I]|[O]))[A-Z]{3}|[A-D]{3}) 

Mise à jour regex:

^[1-9]{1}(|[0-9])\-([A-HJ-NP-Z]{3}[A-D]{3}|[A-HJ-NP-Z]{3}|[A-D]{3}) 

^[1-9]{1} Démarrer par 1 à 9

(|[0-9]) N ou NN

\- tiret (-)

[A-HJ-NP-Z] Évitez I et O

([A-HJ-NP-Z]{3}[A-D]{3}|[A-HJ-NP-Z]{3}|[A-D]{3}) AAABBB ou AAA ou BBB

Vous pouvez le vérifier dans Regex101.

Consultez ma dernière mise à jour: Regex.

+0

Merci pour votre réponse. Comme il peut être AAA ou AAABBB ou BBB je suppose que^[1-9] {1} [0-9] + \ - (?! ([I] | [O])) [AZ] {3}? [ AD] {3}? nous devrions ajouter "?" trop juste? Je pense que votre expression force 6 caractères après le trait d'union. Corrigez-moi si je me trompe –

+0

Je ne suis pas sûr de comprendre pourquoi vous utilisez "|" à la place d'utiliser "?" comme je le mentionnais sur mon commentaire précédent. J'apprécierais une explication! Merci :) –

+0

J'ai utilisé 'I' pour' ou'. «AAABBB» ou «AAA» ou «BBB». '{3}?' Et '{3}' correspondent exactement trois fois. – csharpbd