2014-05-05 37 views
6

我需要檢查德國IBAN的輸入字段。用戶應該被允許在空格處離開,輸入應該被驗證有一個起始DE,然後確切的20個字符的數字和字母。IBAN的正則表達式允許空格並檢查確切長度

沒有空白津貼,我試圖

^[DE]{2}([0-9a-zA-Z]{20})$ 

,但我找不到在哪裏,我怎麼能加上「空格中任何地方。

這應該是簡單的,但我根本無法找到一個解決方案

感謝您的幫助

+1

你使用哪種語言?是從字符串中刪除所有空格符合適的解決方案嗎?此外,FYI,[DE] {2}'匹配DD或ED:請參閱http://www.regular-expressions.info/charclass.html – Robin

+0

,正如我在回答中所說的,您沒有使用正確的工具來完成任務。你*不應該*根據格式檢查與IBAN一樣重要的事情,而是通過計算校驗和來檢查整個代碼的有效性,校驗和在邏輯上與正則表達式一樣複雜。 – zmo

+0

坦克很多!我們確實在後端驗證了正確的IBAN格式,但也想引導用戶前端。 – viddity

回答

6

原文:!

^[DE]{2}([0-9a-zA-Z]{20})$ 

Regular expression visualization

Debuggex Demo

修改:

^DE(?:\s*[0-9a-zA-Z]\s*){20}$ 

Regular expression visualization

Debuggex Demo

+0

鏈接被破壞.. –

19

因爲你應該使用正確的任務的正確工具:你不應該依賴正則表達式來驗證IBAN號碼,而是使用IBAN校驗和算法來檢查整個代碼實際上是否正確,從而使任何正則表達式都是多餘和冗餘的。 :刪除所有空格,重新排列代碼,轉換爲整數並計算餘數,here it's best explained

雖然,那裏就有我想回答你的問題,因爲它的樂趣:

怎麼樣:

^DE([0-9a-zA-Z]\s?){20}$ 

其中唯一的區別的每種情況後,允許空格(或沒有)字母數字字符。

here是可視化:

Regular expression visualization

編輯:對於OP的信息,唯一不同的是,這個正則表達式,從@ ulugbex-umirov:(?:\s*[0-9a-zA-Z]\s*)做了前瞻檢查,看是否有一個空間在ISO國家代碼和校驗和(僅由數字構成)之間,我不特意支持。

而實際上,支持正確的IBAN的語法,這是4個字符組的形成,爲wikipedia page說:

^DE\d{2}\s?([0-9a-zA-Z]{4}\s?){4}[0-9a-zA-Z]{2}$ 

Regular expression visualization

example

如果你的UI是在Javascript ,您可以使用that庫進行IBAN驗證:

<script src="iban.js"></script> 
<script> 
    // the API is now accessible from the window.IBAN global object 
    IBAN.isValid('hello world'); // false 
    IBAN.isValid('BE68539007547034'); // true 
</script> 

所以你知道這是一個有效的IBAN,並且可以在數據甚至被髮送到後端之前驗證它。更簡單,更輕,更優雅...爲什麼還要做其他事情?

+0

關於不依賴於正則表達式來驗證IBAN的好處,但我認爲可以在前端使用正則表達式來捕獲任何明顯的錯誤並引導用戶。我會在後端做更嚴重的IBAN驗證。 –

+0

非常感謝您的回覆!我們也在後端驗證。正則表達式是額外的,對於用戶指導 – viddity

+0

nope,你錯了,校驗和驗證真的很輕,如果不比正則表達式檢查更輕!它可以幫助用戶檢測到任何* real *錯誤,而不是簡單地格式化錯誤,格式錯誤通常是一個問題。此外,您可以支持*任何*校驗和,而不僅僅是德國的校驗和......我一直是很多德國網站的客戶,他們只接受來自德語國家的付款,而我不住在其中一個......我們在歐洲,我們有SEPA和IBAN! :-) – zmo

3

最簡單的解決方案,我能想到的:

^DE(\s*[[:alnum:]]){20}\s*$ 

尤其是你最初的[DE]{2}是錯誤的,因爲它允許「DD」,「EE」,「ED」,以及預期的「DE」 。

1

要允許任何地方的任何空間量:

^ *D *E(*[A-Za-z0-9]){20} *$ 

當你想允許更低的信件,也DE可能是低?

^ *[Dd] *[Ee](*[A-Za-z0-9]){20} *$ 
  • ^字符串
  • $端錨
  • 在每個字符之間有可選的空間*
  • [character class]定義字符的集合/範圍的開始匹配

要允許每個字符之間至多有一個空格,請用?(0或1)替換quantifier*(任何數量的)。如果支持,則可以使用\sshorthand來匹配[ \t\r\n\f]而不是僅限空間。

Test on regex101.com,也看到了SO regex FAQ

2

這是正確的正則表達式匹配DE IBAN帳號:

DE\d{2}[ ]\d{4}[ ]\d{4}[ ]\d{4}[ ]\d{4}[ ]\d{2}|DE\d{20} 

Pass: DE89 3704 0044 0532 0130 00|||DE89370400440532013000 
Fail: DE89-3704-0044-0532-0130-00 
0

使用谷歌Apps腳本,我粘貼Laurent's codegithubscript並添加以下代碼來測試。

// Use the Apps Script IDE's "Run" menu to execute this code. 
// Then look at the View > Logs menu to see execution results. 

function myFunction() { 
//https://github.com/arhs/iban.js/blob/master/README.md 
// var IBAN = require('iban'); 
var t1 = IBAN.isValid('hello world'); // false 
var t2 = IBAN.isValid('BE68539007547034'); // true 
var t3 = IBAN.isValid('BE68 5390 0754 7034'); // true 

Logger.log("Test 1 = %s", t1); 
Logger.log("Test 2 = %s", t2); 
Logger.log("Test 3 = %s", t3); 
} 

運行示例代碼唯一需要的是在評論出require('iban')行: // VAR IBAN =要求( 'IBAN'); 最後,我使用一個服務器處理程序來執行驗證,而不是使用客戶端處理程序來嘗試對IBAN輸入進行RegEx驗證。