2014-02-23 32 views
0

我有以下代碼到一個字符串格式匹配1ab11ab111的Javascript正則表達式匹配簡單的方​​法

其中 =任何數量0到9

一個b =任何字符a到z或A到Z

var str = "1ab11ab111"; 
var patt1 = /[0-9]+[a-z]+[a-z]+[0-9]+[0-9]+[a-z]+[a-z]+[0-9]+[0-9]+[0-9]/i; 

那麼有沒有更簡單的方法/代碼爲相同的字符串匹配?

回答

2

您提供的這個正則表達式可以匹配任何包含小寫字母和數字的字符串。

我覺得你真的想:

/^\d[a-z]{2}\d{2}[a-z]{2}\d{3}$/i 

以下是我測試:

/^\d[a-z]{2}\d{2}[a-z]{2}\d{3}$/i.test('1ab11ab111'); // true 
/^\d[a-z]{2}\d{2}[a-z]{2}\d{3}$/i.test('1ab11Ab111'); // true 
/^\d[a-z]{2}\d{2}[a-z]{2}\d{3}$/i.test('1ab11ab11'); // false 
+0

但** a **或** b **可以是小寫或大寫字符。而你的代碼只檢查小寫 –

+1

我剛更新了它。你也應該在你的問題中說清楚。 –

+0

謝謝你的代碼在邏輯上是正確的:) –

3

那麼[0-9]可以簡化爲\d。如果這些字符類中的每一個指(而不是一個或象現在這樣更多)完全匹配一個字符,可以類似的字符類用同一個{…}量詞,像這樣:

var patt1 = /\d[a-z]{2}\d{2}[a-z]{2}\d{3}/; 

這將匹配和字符串由一個數字組成,後跟兩個小寫拉丁字母,後跟兩個數字,後面跟兩個小寫拉丁字母,後跟三個數字。

但它可以通過分組某些元素被簡化甚至多了起來,就像這樣:

var patt1 = /(\d[a-z]\d){2}\d{2}/; 

這將匹配所有單個數字的,後面兩個小寫拉丁字母,其次是一個數字,捕獲到組1中,該組必須出現兩次,然後是兩個數字。

還要注意,這兩個字符都會匹配任何與字符串—中的任何字符匹配的字符序列,例如, 'foo1ab11ab111bar'將是有效的匹配項。如果這是一個問題,使用起始(^)和結束($)錨,以防止前或匹配的子字符串後出現的任何字符,像這樣:

var patt1 = /^(\d[a-z]\d){2}\d{2}$/; 
1
/[0-9][a-z]+[0-9]+[a-z]+[0-9]+/ 

應該是足夠

對於精確匹配,你應該這樣做,其中A和b可以是一個大寫字母,你要求:

/[0-9][a-zA-Z]{2}[0-9]{2}[a-zA-Z]{2}[0-9]{3}/ 

DEMO

+0

但是當我給** ** 1ab111ab111而不是** ** 1ab11ab111其顯示我的字符串匹配。 –

+0

@hsaka編輯答案 –

1

您可以使用/[0-9][a-z]{2}[0-9]{2}[a-z]{2}[0-9]{3}/i

可以代替[0-9]使用\d。因此,該模式將使用\d

/\d[a-z]{2}\d{2}[a-z]{2}\d{3}/i 

您測試這個在http://regex101.com/r/fS9cB6

+0

謝謝,你的代碼看起來更簡單明確 –

+0

這將匹配'99999929329AAABABSABAbas1ab11ab111fdisjaoifjio33',我敢肯定你不想要。您需要添加'^'和'$'。 –

+0

@BillCriswell它不符合你的字符串與上面的代碼。 http://jsfiddle.net/y6g5e/1/ –