2011-02-09 9 views
9

Devo convalidare l'inserimento della casella di testo come numero di carta di credito. Ho già regex per diverse carte di credito:Posso "combinare" 2 regex con una logica o?

  • 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}$

e molti altri.

Il problema è che voglio convalidare utilizzando espressioni regolari diverse basate su utenti diversi. Ad esempio: per user1, Visa e Mastercard sono disponibili, mentre per user2, Visa e American Express sono disponibili. Quindi vorrei generare una stringa regex finale in modo dinamico, che combina una o più stringhe regex sopra, come:

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

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

C'è un modo per farlo? Grazie,

risposta

13

Lei non ha precisato la lingua ma per qualsiasi motivo ho il sospetto che sia JavaScript. Basta fare:

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

È inoltre possibile utilizzare (?:) per l'esecuzione più veloce (non cattura raggruppamento), ma ho omesso che per migliorare la leggibilità.

+0

+1 per '(' :) che funziona con '? (:? foo | bar)' per logica o con le stringhe | caratteri di caratteri multipli – n611x007

+0

Ho provato questo e 'Visaregex' deve essere tagliato, altrimenti le barre verranno incluse letteralmente nella combinazione. in altre parole se 'Visaregex ==/ab + c /' e 'Mastercardregex ==/de + f /' allora 'user1Regex' finirà per essere'/(\/ab + c \ /) | (\/de + f \ /)/', non'/(ab + c) | (de + f)/'come volevamo. Quindi cambierei la tua risposta a: 'let user1Regex = new RegExp (\' ($ {Visaregex.toString(). Slice (1, -1)}) | ($ {Mastercardregex.toString(). Slice (1, - 1)}) \ ');'. – chharvey

2

Non è sicuro quale lingua si sta utilizzando per implementare, ma è possibile utilizzare un singolo | per utilizzare una logica o più espressioni regolari. Il mio suggerimento sarebbe quello di memorizzare ogni regex come una stringa e quindi concatenare e compilare quando necessario.

in python che sarebbe qualcosa di simile

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

Utilizzare il pulsante | operatore e di gruppo tutti con Parentesis()

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

Se tutte le espressioni regolari sono corrette dovrebbe funzionare

+0

+1, forse nota '(? :)' in particolare? – n611x007