2015-10-06 94 views
1

我试图验证被允许属于多个范围的数字。例如:正则表达式来验证数字的多个范围

一个数字x是有效的,如果它位于150-200之间,或700-750

基本上我要存储在数据库中这些限制,所以我想将它们存储为正则表达式会是处理这个问题的好方法。

我是新来的正则表达式,所以我不能够拿出一个为上述验证。

+1

正则表达式不是处理这个问题的好方法* ...你使用的是DBMS,坚持已经在DB中的工具...正则表达式很慢。如果您使用的是SQL,请查看http://stackoverflow.com/questions/1736630/sql-constraint-minvalue-maxvalue ...否则,标记您的DBMS – Mariano

+1

@Mariano变慢可能不是主要问题。如果范围会更复杂创建和维护正则表达式将是噩梦:http://stackoverflow.com/a/20793792/1393766 – Pshemo

+0

@Pshemo我知道,我已经走这条路只是为了好玩。当然,你总是可以[作弊](http://utilitymill.com/utility/Regex_For_Range) – Mariano

回答

1

解决方案:

1[5-9][0-9]|200|7[0-4][0-9]|750 

说明:

既然你有一个很好的界定范围,正则表达式是相当简单的。

它可以被分解为两个部分:

    通过 OR 通过 OR

所以,放在一起正则表达式将读为

((150 通过 OR 200)OR(700 通过 OR 750))

你的第一数目是150,因此,我们将具有匹配一个 '1' 的第一个数字后跟第二个数字的范围,可能是5到9(你不想少于150,所以4和更少),第三个数字的范围也可以是任何东西0〜9这捕获来自150的所有数字至199

最后NU在第一个范围内是200,所以我们可以找到它。它与该范围内的其他可能性完全不同,因此更容易寻找它,而不是试图想到将它包含在正则表达式范围中的复杂方式。

第二范围遵循相同PATTEN但具有不同的号码。再次,我们通过使用正则表达式范围来查找大部分数字,并查找最后一个数字750,特别是因为它太不同了 - 中间数字为5。如果我们在中等正则表达式范围内包含5,则它将上升到759,这超出了范围。

最后,零件和正则表达式是准备好了。

调整您的输入。你可能需要用^和$作为开头和结尾的一部分,或者如果你的输入有其他文本围绕着这个数字,扩展你的正则表达式以适当地处理它。

+4

虽然这个正则表达式可能回答这个问题,但提供关于为什么和/或代码如何回答这个问题的附加上下文会提高它的长期价值。 – JAL

+0

您可能想将它锚定到'^'和'$'以避免与其他号码匹配 – Mariano

+1

@JAL好点。答案现在提供了解释。 – keda