2011-02-09 13 views
9

Metin kutusu girişini kredi kartı numarası olarak doğrulamanız gerekiyor.2 regex'i bir mantıkla birleştirebilir miyim?

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

ve diğerleri zaten farklı kredi kartları için regex var.

Sorun şu ki, farklı kullanıcılara dayalı farklı normal ifadeler kullanarak doğrulamak istiyorum. Örneğin: Kullanıcı1 için Visa ve Mastercard mevcuttur, kullanıcı2 için ise Visa ve American Express mevcuttur.

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

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

Bunu yapmanın bir yolu var mı: Ben gibi yukarıdaki bir veya daha fazla regex dize birleştirerek, dinamik bir son regex dize oluşturmak istersiniz? Teşekkürler,

cevap

13

gibi bir şey olurdu. Ayrıca daha hızlı yürütme (olmayan yakalayan gruplama) için (?:) kullanabilirsiniz

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

ama okunabilmesi için bu atladık: Sadece yapmak.

+0

+1 çalışması gerekir :)' ('çalışır:? foo | bar)' mantıksal veya dizeleri ile | Birden fazla karakter karakterleri – n611x007

+0

Bunu test ettim ve Visaregex'in dilimlenmesi gerekiyor ya da eğik çizgi harfleri tam anlamıyla bir araya getirilecek. diğer bir deyişle, Visaregex ==/ab + c/'ve' Mastercardregex ==/de + f/'ise' user1Regex', '/ (\/ab + c \ /) | (\/de + f \ /)/','/(ab + c) | (de + f)/'istediğimiz gibi değil. Bu yüzden cevabınızı şöyle değiştirebilirim: 'kullanici1Regex = yeni RegExp (\' ($ {Visaregex.toString(). Dilim (1, -1)}) | ($ {Mastercardregex.toString(). Dilim (1, - 1)}) \ ');'. – chharvey

2

Uygulamak için hangi dili kullandığınızdan emin değilsiniz, ancak bir mantıksal veya çoğu düzenli ifade kullanmak için tek bir | kullanabilirsiniz. Benim önerim, her düzenli ifadeyi bir dize olarak saklamak ve gerektiğinde birleştirmek ve derlemek olacaktır.

python Bunu Dil devlet yoktu ama her nedense ben JavaScript şüpheli

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

Kullan | Tüm Parentesis()

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

ile operatör ve grup Bütün düzenli ifade doğruysa o (`için

+0

+1, belki dikkat edin (? :) 'özellikle? – n611x007

İlgili konular