【问题标题】:Regular expression to validate multiple ranges of numbers用于验证多个数字范围的正则表达式
【发布时间】:2015-10-06 18:48:37
【问题描述】:

我正在尝试验证允许属于多个范围的数字。例如:

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

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

我是正则表达式的新手,所以无法想出一个用于上述验证的方法。

【问题讨论】:

  • 正则表达式并不是处理此问题的好方法...您正在使用 DBMS,坚持使用数据库中已有的工具...正则表达式是减缓。如果您使用 SQL,请检查此stackoverflow.com/questions/1736630/… ...否则,请标记您的 DBMS
  • @Mariano 速度慢可能不是主要问题。如果范围会更复杂,创建和维护正则表达式将是一场噩梦:stackoverflow.com/a/20793792/1393766
  • @Pshemo 我知道,我这样做只是为了好玩。当然,你可以随时cheat
  • @Mariano 你觉得我如何为那个答案创建正则表达式;)(太糟糕了,该网站现在离线了)。
  • @Pshemo 啊,我刚看到你帖子中的链接。 :-)

标签: java regex validation


【解决方案1】:

解决方案:

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

说明:

由于您有一个非常明确的范围,因此正则表达式相当简单。

可以分为两部分:

  1. 150 199 200
  2. 700 749 750

因此,将正则表达式放在一起将读取为

((150 199 OR 200) OR (700 749 OR强> 750))

您的第一个数字是 150,因此我们必须匹配第一个数字的“1”,然后匹配第二个数字的范围,该范围可能是 5 到 9(您不希望小于 150,所以 4并且更少),然后是第三位数字的范围,可以是 0 到 9 之间的任何数字。这将捕获从 150 到 199 的所有数字。

第一个范围的最后一个数字是 200,所以我们可以直接查找。它与该范围内的其他可能性差异太大,因此更容易专门寻找它,而不是尝试考虑一种复杂的方式将其包含在正则表达式范围中。

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

最后,OR两个部分和正则表达式都准备好了。

根据您的输入进行调整。您可能需要在行首和行尾用 ^ 和 $ 将其括起来,或者如果您的输入在相关数字周围有其他文本,请扩展您的正则表达式以适当地处理它。

【讨论】:

  • 虽然此正则表达式可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
  • 您可能希望将其锚定到 ^$ 以避免匹配其他数字
  • @JAL 好点。现在在答案中提供了解释。
  • @Mariano 您假设该数字在其自己的行上。我故意避免用任何东西包围正则表达式。答案回应了 shiladitya 的具体问题。他没有提供更多细节,因此对他的意见的假设可能会使答案变得不必要地复杂和混乱。
  • @keda 任何锚点都应该足够,无论是线、边界还是环视,以避免不希望的结果:“为什么它与主题 "1200" 匹配”。不过,您确实在上次编辑中澄清了这一点。
猜你喜欢
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
相关资源
最近更新 更多