2011-02-09 5 views
9

Je dois valider l'entrée Textbox comme numéro de carte de crédit. J'ai déjà regex pour différentes cartes de crédit:Puis-je "combiner" 2 regex avec une logique ou?

  • Visa: ^4[0-9]{12}(?:[0-9]{3})?$
  • Mastercard: ^([51|52|53|54|55]{2})([0-9]{14})$
  • American Express: ^3[47][0-9]{13}$

et bien d'autres.

Le problème est, je veux valider en utilisant différents regex basé sur différents utilisateurs. Par exemple: Pour l'utilisateur 1, Visa et Mastercard sont disponibles, tandis que pour l'utilisateur 2, Visa et American Express sont disponibles. Donc, je voudrais générer une chaîne de regex finale dynamique, combinant un ou plusieurs chaînes regex ci-dessus, comme:

user1Regex = Visa regex + "||" + Mastercard regex 

user2Regex = Visa regex + "||" + American Express regex 

Est-il possible de le faire? Merci,

Répondre

13

Vous n'avez pas dit votre langue, mais pour une raison quelconque, je soupçonne que c'est JavaScript. Il suffit de faire:

var user1Regex = new RegExp('(' + Visaregex + ")|(" + Mastercardregex + ')'); 
// or if es6: 
let user1Regex = new RegExp(`(${Visaregex})|(${Mastercardregex})`); 

Vous pouvez également utiliser (?:) pour une exécution plus rapide (groupe non-capture) mais j'ai omis que pour une meilleure lisibilité.

+0

+1 pour '(:)' qui fonctionne avec '(? foo | bar)' pour logique ou avec des cordes | plusieurs caractères caractères – n611x007

+0

J'ai testé cela, et 'Visaregex' doit être découpé en tranches ou sinon les barres obliques seront incluses littéralement dans la combinaison. en d'autres termes si 'Visaregex ==/ab + c /' et 'Mastercardregex ==/de + f /' alors 'user1Regex' finirait par être'/(\/ab + c \ /) | (\/de + f \ /)/', pas'/(ab + c) | (de + f)/'comme nous le voulions. Donc, je voudrais changer votre réponse à: 'let user1Regex = new RegExp (\' ($ {Visaregex.toString(). Tranche (1, -1)}) | ($ {Mastercardregex.toString(). Tranche (1, - 1)}) \ ');'. – chharvey

2

Vous ne savez pas quelle langue utiliser pour implémenter mais vous pouvez utiliser un seul | pour utiliser une expression logique ou plus. Ma suggestion serait de stocker chaque regex comme une chaîne, puis concaténer et compiler si nécessaire.

en python, il serait quelque chose comme

visa = "visa_regex" 
mastercard = "mastercard_regex" 
combined = re.compile(visa + "|" + mastercard)
10

Utilisez le menu | opérateur et le groupe avec tous PARENTESIS()

^(4[0-9]{12}(?:[0-9]{3})?|([51|52|53|54|55]{2})([0-9]{14})|3[47][0-9]{13})$ 

Si tous les regex sont corrects, il devrait fonctionner

+0

+1, peut-être noter '(? :)' surtout? – n611x007