2011-02-09 24 views
9

Tôi cần xác thực tính năng Nhập văn bản làm số thẻ tín dụng. Tôi đã có regex cho thẻ tín dụng khác nhau:Tôi có thể "kết hợp" 2 regex với một logic hay không?

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

và nhiều người khác.

Vấn đề là, tôi muốn xác thực bằng cách sử dụng regex khác nhau dựa trên những người dùng khác nhau. Ví dụ: Đối với user1, Visa và Mastercard có sẵn, trong khi đối với user2, Visa và American Express có sẵn. Vì vậy, tôi muốn tạo một chuỗi regex cuối cùng động, kết hợp một hoặc nhiều chuỗi regex ở trên, như:

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

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

Có cách nào để làm điều đó không? Cảm ơn,

Trả lời

13

Bạn không chỉ định ngôn ngữ của bạn, nhưng vì lý do gì tôi nghi ngờ đó là JavaScript. Chỉ cần làm:

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

Bạn cũng có thể sử dụng (?:) để thực hiện nhanh hơn (không bắt nhóm) nhưng tôi đã bỏ qua điều đó để có thể đọc.

+0

1 cho '(:) 'mà làm việc với' (:? foo | thanh) 'cho logic hoặc với chuỗi | nhiều ký tự ký tự – n611x007

+0

Tôi đã thử nghiệm điều này và 'Visaregex' cần được cắt bớt hoặc các dấu gạch chéo khác sẽ được đưa vào nghĩa đen thành kết hợp. nói cách khác, nếu 'Visaregex ==/ab + c /' và 'Mastercardregex ==/de + f /' thì 'user1Regex' sẽ kết thúc bằng'/(\/ab + c \ /) | (\/de + f \ /)/', không phải'/(ab + c) | (de + f)/'như chúng ta muốn. Vì vậy, tôi sẽ thay đổi câu trả lời của bạn thành: 'let user1Regex = new RegExp (\' ($ {Visaregex.toString(). Slice (1, -1)}) | ($ {Mastercardregex.toString(). Slice (1, - 1)}) \ ');'. – chharvey

2

Không chắc chắn bạn đang sử dụng ngôn ngữ nào để triển khai nhưng bạn có thể sử dụng một đơn | để sử dụng lôgic hợp lý hoặc nhiều nhất. Đề xuất của tôi là lưu trữ từng regex dưới dạng chuỗi và sau đó ghép nối và biên dịch khi cần thiết.

trong python nó sẽ là một cái gì đó giống như

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

Sử dụng | điều hành và nhóm tất cả với parentesis()

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

Nếu tất cả các regex là chính xác nó nên làm việc

+0

+1, có thể lưu ý '(? :)' đặc biệt? – n611x007

Các vấn đề liên quan