2011-02-09 93 views
9

我需要驗證文本框輸入作爲信用卡號碼。我已經有不同的信用卡正則表達式:我可以「結合」2個正則表達式與邏輯或?

  • 簽證:^4[0-9]{12}(?:[0-9]{3})?$
  • 萬事達卡:^([51|52|53|54|55]{2})([0-9]{14})$
  • 美國運通:^3[47][0-9]{13}$

等等。

問題是,我想驗證使用不同的正則表達式基於不同的用戶。例如:對於用戶1,Visa和Mastercard可用,而對於用戶2,Visa和American Express可用。所以,我想動態生成最終的正則表達式的字符串,上述組合一個或多個正則表達式字符串,如:

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

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

有沒有辦法做到這一點?謝謝,

回答

13

你沒有說明你的語言,但不管是什麼原因,我懷疑它的JavaScript。只要做到:

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

您還可以使用(?:)實現更快的執行(非捕獲分組),但我已經省略了以提高可讀性。

+0

+1`(:)`與`(作品:??FOO |條)`邏輯或用字符串|多個字符字符 – n611x007 2013-07-03 16:02:10

+0

我測試了這個,'Visaregex`需要切片,否則斜線會被包含在組合中。換句話說,如果`Visaregex ==/ab + c /`和`Mastercardregex ==/de + f /`,那麼`user1Regex`最終會變成`/(\/ab + c \ /)|(\/de + f//),而不是`/(ab + c)|(de + f)/`就像我們想要的那樣。所以我會改變你的答案:`let user1Regex = new RegExp(\`($ {Visaregex.toString()。slice(1,-1)})|($ {Mastercardregex.toString()。slice(1, - 1)})\`);`。 – chharvey 2017-10-14 19:21:12

2

不確定您使用哪種語言來實現,但您可以使用單個|來使用邏輯或大多數正則表達式。我的建議是將每個正則表達式存儲爲一個字符串,然後在需要時連接並編譯。

在Python它會是這樣的

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

使用|運營商和集團所有parentesis()

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

如果所有的正則表達式是正確的它應該工作