是否可以编写正则表达式来查找大于x的字符串中的数字?

时间:2014-05-04 00:25:37

标签: regex validation

是否可以编写正则表达式来查找字符串中大于x的数字?

比如说x = 1800

我们可以找到一个数字>字符串中的1800:“3,000.00 /月”| “2800美元”| “150,000.00a月”| “只需1900美元”等?正则表达式会找到3,000.00,2800,150,000.00和1900,因为它们都大于1899年。

这种模式让我不知所措......

1 个答案:

答案 0 :(得分:1)

你可以找到任何格式正确的数字大于带正则表达式的数字,但随着数字变大,它会变得更复杂。

让我们从一个简单的示例开始,其中x = 11,并且您希望在大于11的字符串中找到任何数字。您编写的正则表达式将遵循类似于以下解决方案的模式:

(\d{3,}|[2-9]\d|1[2-9])(\.\d+)?|11\.\d*[1-9]\d*

REY

前三次内部轮换的目的是什么?第一个捕获任意三个或更多个数字,第二个任意两位数字,其中10位的数字是2-9,最后一个任意两位数字,10位数字位于10位是1,1的位数是2-9。然后它可选地捕获任何十进制十进制数字。

第二个外部交替实际上匹配整数部分中的x,但随后检查小数部分以确保它在某种程度上更大。如果x的小数部分为12,则只需120*\d*|1[3-9]\d*|2\d*

有两种情况会使上述模式无效:

  • 当数字包含逗号
  • 当一个数字以零开头时。

以下示例也处理了这些情况,并解决了x = 1800。

#FIND any number > 1800
(?=[1-9])                            # ensure number doesn't begin with a zero
(
  (\d{1,3},(?=\d{3}))*\d{2,3},\d{3}| # any number that has >= 5 digits with commas   
  \d{5,}|                            # any number that has >= 5 digits without commas
  [2-9],?\d{3,}|                     # any 4 digit number that starts with 2-9
  1,?9\d{2}|                         # any 4 digit number that starts with 1 then 2-9
  1,?8[1-9]\d|                       # any 4 digit number that starts with 18 then 1-9
  1,?80[1-9]                         # any 4 digit number that starts with 180 then 1-9
)
(\.\d+)?                             # any decimal digits
|1,?800\.\d*[1-9]\d*                 # any number whoses integer = 1800, 
                                     # ... then has a decimal with a non-zero digit.

REY

在正则表达式的顶部是使用向前看以确保数字实际上以1-9开头。没有它,像00005这样的数字会被混淆为五位数字。

内部组找到大于1800的所有整数匹配,就像第一个尝试匹配大于11的数字的示例一样。可能,唯一不明显的变化是第一个 - (\d{1,3},(?=\d{3}))*\d{2,3},\d{3}。要查找5位数字,它匹配1-3个数字后跟逗号,然后是2-3个数字,一个逗号,然后是最后3个数字。如果没有前瞻,它将错误地匹配非数字,例如234,23,412。

如果您对逗号感到挑剔,就像我一样,那么您将无法整合逗号和非逗号案例,例如1,?9\d{2} =&gt ; 1914年& 1914。当尝试查找大于一百万的数字时,多个,?会导致错误的匹配,例如1000,050。