2016-11-10 100 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)));