2017-10-16 5 views
2

J'essaie d'écrire un modèle regex pour valider les identificateurs de transaction uniques (UTI). Voir la description: hereRegex pour valider l'identificateur de transaction unique

L'UTI se compose de deux parties concaténées, le préfixe et l'identificateur de transaction. Voici un résumé des règles que j'essaie de prendre en compte:

  • Le préfixe est exactement 10 caractères alphanumériques.
  • L'identificateur de transaction comporte de 1 à 32 caractères.
  • L'identificateur de transaction est alphanumérique, mais les caractères spéciaux suivants sont également autorisés: . : _ -
  • Les caractères spéciaux ne peuvent pas apparaître au début ou à la fin de l'identificateur de transaction.
  • Il est interdit d'avoir deux caractères spéciaux à la suite.

je l'ai jusqu'à présent construit un modèle pour valider l'UTI pour les 4 premiers de ces points (en correspondance avec boîtier ignoré):

^[A-Z0-9]{11}((\w|[:\.-]){0,30}[A-Z0-9])?$ 

Cependant je lutte avec le dernier point (pas deux caractères spéciaux d'affilée). J'admets volontiers être un peu novice quand il s'agit de regex et je pensais qu'il pourrait y avoir une technique plus avancée que je ne connais pas pour accomplir cela. Est-ce que tous les gourous regex là-bas veulent m'éclairer?


Résolu: Merci à l'utilisateur Bohemian pour me aider à trouver le modèle que je cherchais. Ma solution finale ressemble à ceci:

^[a-zA-Z0-9]{11}((?!.*[.:_-]{2})[a-zA-Z0-9.:_-]{0,30}[a-zA-Z0-9])?$ 

je vais laisser la question ouverte pour obtenir des réponses de suivi au cas où quelqu'un a d'autres suggestions d'amélioration.

+0

Votre regex suggère que les lettres doivent être en majuscules. Est-ce vrai? Les lettres minuscules sont aussi "alphanumériques". – Bohemian

+0

@Bohemian: Oui, je suis en train d'exécuter le moteur correspondant avec le boîtier ignoré activé, j'ai fait une petite remarque à ce sujet. –

Répondre

2

Essayez ceci:

^[A-Z0-9]{11}(?!.*[.:_-]{2})[A-Z0-9.:_-]{0,30}[A-Z0-9]$ 

La sauce secrète est le regard négatif avant (?!.*[.:_-]{2}), qui affirme (sans entrée consommer) que le texte suivant ne pas contiennent 2 caractères « spéciaux » consécutifs .:_-.


Notez que votre tentative, qui utilise \w, permet des lettres minuscules et souligne aussi, parce que \w est le même que [a-zA-Z0-9_]

+0

Merci, c'était exactement ce que je cherchais! J'ai fait un ajustement mineur, affichant ma solution finale dans un montage ci-dessus. –