2011-02-09 15 views
9

Necesito validar la entrada del cuadro de texto como número de tarjeta de crédito. Ya tengo expresiones regulares para diferentes tarjetas de crédito:¿Puedo "combinar" 2 regex con una lógica 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}$

y muchos otros.

El problema es que quiero validar el uso de diferentes expresiones regulares basadas en diferentes usuarios. Por ejemplo: para el usuario 1, Visa y Mastercard están disponibles, mientras que para el usuario 2, Visa y American Express están disponibles. Así que me gustaría para generar una cadena de expresiones regulares última forma dinámica, la combinación de una o más expresiones regulares cadena arriba, como:

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

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

¿Hay una manera de hacer eso? Gracias,

Respuesta

13

Usted no declaró su idioma, pero por alguna razón por la que sospecha que es JavaScript. Sólo hacer:

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

También puede utilizar (?:) para la ejecución rápida (agrupación no captura), sino que he omitido para facilitar la lectura.

+0

1 para '(:)' 'que trabaja con (?:? foo | bar)' para la lógica o con cuerdas | Caracteres múltiples caracteres – n611x007

+0

Probé esto, y 'Visaregex' necesita ser cortado o de lo contrario las barras se incluirán literalmente en la combinación. en otras palabras, si 'Visaregex ==/ab + c /' y 'Mastercardregex ==/de + f /' entonces 'user1Regex' terminaría siendo'/(\/ab + c \ /) | (\/de + f \ /)/', no'/(ab + c) | (de + f)/'como quisiéramos. Así que cambiaría su respuesta a: 'let user1Regex = new RegExp (\' ($ {Visaregex.toString(). Slice (1, -1)}) | ($ {Mastercardregex.toString(). Slice (1, - 1)}) \ ');'. – chharvey

2

No estoy seguro de qué idioma está utilizando para implementar, pero puede usar un solo | para usar una expresión lógica o la mayoría de expresiones regulares. Mi sugerencia sería almacenar cada expresión regular como una cadena y luego concatenar y compilar cuando sea necesario.

en Python sería algo así como

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

Utilice | operador y el grupo todos con parentesis()

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

Si todas las expresiones regulares son correctas debería funcionar

+0

+1, tal vez note '(? :)' especialmente? – n611x007

Cuestiones relacionadas