2011-02-09 10 views
9

Muszę zweryfikować dane wejściowe Textbox jako numer karty kredytowej. Mam już regex dla różnych kart kredytowych:Czy mogę "połączyć" 2 wyrażenia regularne z logiką lub?

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

i wiele innych.

Problem polega na tym, że chcę sprawdzić poprawność za pomocą różnych wyrażeń regularnych na podstawie różnych użytkowników. Na przykład: dla użytkownika 1 dostępne są karty Visa i Mastercard, natomiast dla użytkownika 2 dostępne są karty Visa i American Express. Więc chciałbym, aby wygenerować ostateczny regex ciąg dynamicznie, łącząc jeden lub więcej regex ciąg powyżej, jak:

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

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

Czy istnieje sposób to zrobić? Dzięki,

Odpowiedz

13

Nie podała swój język, ale z jakiegoś powodu to podejrzewam JavaScript. Wystarczy zrobić:

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

Można również użyć (?:) na szybsze wykonanie (non-przechwytywanie grupy), ale pominięto, że dla czytelności.

+0

+1 dla '(:)' 'która współpracuje z (?:? foo | bar)' za logiczny lub ze sznurkami | wiele znaków chatu – n611x007

+0

Przetestowałem to, a 'Visaregex' musi zostać pokrojony, inaczej ukośniki zostaną włączone dosłownie do kombinacji. innymi słowy, jeśli 'Visaregex ==/ab + c /' i 'Mastercardregex ==/de + f /' to 'user1Regex' kończy się na'/(\/ab + c \ /) | (\/de + f \ /)/', nie'/(ab + c) | (de + f)/'jak chcieliśmy. Więc zmieniłbym twoją odpowiedź na: 'let user1Regex = new RegExp (\ {{Visaregex.toString(). Slice (1, -1)}) | ($ {Mastercardregex.toString(). Slice (1, - 1)}) \ ');'. – chharvey

2

Nie jesteś pewien, którego języka używasz do implementacji, ale możesz użyć pojedynczego |, aby użyć logicznego lub większego wyrażenia regularnego. Moją sugestią byłoby przechowywanie każdego wyrażenia regularnego jako łańcucha znaków, a następnie łączenie i kompilowanie w razie potrzeby.

w Pythonie byłoby coś jak

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

Użyj | operator i grupa wszystko z Paréntesis()

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

Jeśli wszystkie są poprawne regex powinien pracować

+0

+1, może zauważysz '(? :)' szczególnie? – n611x007

Powiązane problemy