2011-11-22 19 views
0

我验证我的输入,如果它通过上述两个正则表达式。 我怎样才能调整这两个正则表达式,以便它接受一个列表即(如在input2和input3上)。现在我的正则表达式只适用于input1。调整正则表达式来接受几种模式

2或更高:

^\d{2}\d*$ 

非0:

​​
input1: 123 
input2: 123, 456 
input3: 123, 456, 789 

回答

1

首先,您发布的图案相当于^\d{2,}$,这需要数有两个或更多数字。大于或等于2的整数的正则表达式更像^[+-]?0*([2-9]|[1-9]\d+)$。根据你的描述,目前还不清楚你想要的是哪一种。

无论哪种方式,你想用的是这样的:

^(<pattern>(,\s|$))+$` 

因此,对于你的情况,这将是这样的:

^(\d{2,}(,\s|$))+$    #2 or more digits 
^(0*([2-9]|[1-9]\d+)(,\s|$))+$ #positive integers >= 2 
^(0*[1-9]\d*)(,\s|$))+$   #positive integers > 0 

我不知道是什么味道你使用的正则表达式,但如果你的引擎在上述模式中冗余使用$,你可以尝试类似于

^(<pattern>,\s)*<pattern>$ 
改为10

。例如:

^(\d{2,},\s)*\d{,2}$ #2 or more digits, simplified 

记住,一个更好的方式来做到这一点通常是分裂的逗号+空格分隔,这将给你的字符串,你可以尝试解析为一个整数数组的字符串。

0

首先,这里是我建议你基地的正则表达式:

两个或多个数字:

\d{2,} 

一个或多个数字:

\d+ 

现在,如果你希望他们中的任何一个匹配逗号和空格分隔的列表,您可以使用:

(?:\d{2,}(?:\s*,\s*)?)+ 

(?:\d+(?:\s*,\s*)?)+ 

分别

+0

这也运行到我下面马克的回答中描述的灾难性回溯问题。如果分隔符是完全可选的,则捕获开始和结束的位置不明确。 –

0

尝试这种情况:

^[1-9]\d*(?:\s*,\s*[1-9]\d*)*$ 

[1-9]\d*一个或多个数字,其中第一个不能为零相匹配。如果第一个数字后面还有更多字符,则它们必须包含一个逗号(可选),其中包含空格 - \s*,\s* - 后跟另一个数字。并且重复必要的次数。

如果你喜欢,你可以对格式更加严格。例如,如果逗号一定次数后紧跟并且必须有逗号后的一个空格,您可以使用此:

^[1-9]\d*(?:, [1-9]\d*)*$ 
+0

为了验证,您可以将第一个'*'变成'+',以便字符串不能以逗号开头。尽管如此,这将使空列表无法匹配。 –