2016-11-10 66 views
0

幫助正則表達式匹配這個數字模式..我只需要接受下面的格式輸入。爲了實現這個驗證邏輯我需要正則表達式。 我嘗試使用以下用於數字格式驗證的正則表達式

/(^(([0-9]{5,6}[,])+[0-9]{5,6})$)|(^(([0-9]{1,5}\*[,])+[0-9]{1,5}\*)$)|(^(([0-9]{5,6}[,])+[0-9]{1,5}\*)$)|(^(([0-9]{1,5}\*[,])+[0-9]{1,5})$)/ 

但它不匹配的所有場景。

以下是可能的輸入

  1. 1123 *,2133 *,123 *,1 *
  2. 213433,123453,123 *
  3. 123333,123623,678123,12323,
  4. 1123 *,123445,166788,123333,..........

條件 - 數字可以有5或6的長度。輸入必須用逗號分隔。如果輸入有*(通配符搜索)那麼最大長度不能大於5 EX 123123(不允許)*

+1

你能解釋一下模式嗎? – Barmar

+1

這與您在一小時前問過的問題不同嗎? http://stackoverflow.com/questions/40535382/regex-for-number-series-validation – Barmar

+0

減去要求 - 我加了他們 – mplungjan

回答

1

我不知道我完全理解了正則表達式匹配模式的要求,但這裏有一個初步探討。

  • 正如我明白你,編號[待匹配]可以具有長度5或6和匹配圖案應當能夠捕獲符合該描述的數字的任何量。對於這部分,我將假定數字序列中不包含星號字符(*)。

我們假設我們有一個變量input,它被賦值爲字符串213433,123453,123*。然後...

input.match(/\d{5,6}(?!\*)/g); 

應該捕獲input變量的部分,如上所述。我注意到你在嘗試使用字符集(,即[0-9]部分); \d期限完成相同的事情。(?!\*)部分用於檢查5或6位序列後面是否沒有星號字符。注意:您必須轉義星號。

  • 如果輸入具有星號字符,則匹配部分不能超過5個字符。 (我希望我正確理解提示)!爲此,下面的RegExp模式適用於我運行的兩個測試(不可否認)。注:該模式保留(,即,匹配/捕獲)星號字符以及數字序列。

爲了測試下一個RegExp匹配模式,我們可以假設這裏的input變量被分配給字符串1123*,2133*,123*,1*

input.match(/(\d+\*){1,5}/g); 

如果我沒有記錯的話,這兩個匹配模式可以有條件地使用簡單的OR(|)運營商合併。

input.match(/\d{5,6}(?!\*)|(\d+\*){1,5}/g); 

希望這會有所幫助。作爲最終測試,讓我們將input變量賦值爲字符串1123*,2133*,123*,1*,123333,123623,678123,12323(我連接了示例輸入1和3,您爲此提供的)。然後,直接運行上面的語句返回數組:

["1123*", "2133*", "123*", "1*", "123333", "123623", "678123", "12323"] 

如果你想找回比賽沒有任何通配符(*),你可以簡單地修改表達式如下:

a.match(/\d{5,6}(?!\*)|(\d+\*){1,5}/g).map(val => val.replace('*', '')); 

得到...

["1123, "2133", "123", "1", "123333", "123623", "678123", "12323"] 
1

這似乎不是很複雜,如果我理解這個問題。

var x = ['1123*,2133*,123*,1*', '213433,123453,123*', '123333,123623,678123,12323', '1123*,123445,166788,123333']; 
 

 
var re = /\d{5,6}|\d{1,5}\*/g; 
 

 
console.log(x.map(s => s.match(re)));