是否可以编写正则表达式来查找字符串中大于x的数字?
比如说x = 1800
我们可以找到一个数字>字符串中的1800:“3,000.00 /月”| “2800美元”| “150,000.00a月”| “只需1900美元”等?正则表达式会找到3,000.00,2800,150,000.00和1900,因为它们都大于1899年。
这种模式让我不知所措......
答案 0 :(得分:1)
你可以找到任何格式正确的数字大于带正则表达式的数字,但随着数字变大,它会变得更复杂。
让我们从一个简单的示例开始,其中x = 11,并且您希望在大于11的字符串中找到任何数字。您编写的正则表达式将遵循类似于以下解决方案的模式:
(\d{3,}|[2-9]\d|1[2-9])(\.\d+)?|11\.\d*[1-9]\d*
前三次内部轮换的目的是什么?第一个捕获任意三个或更多个数字,第二个任意两位数字,其中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.
在正则表达式的顶部是使用向前看以确保数字实际上以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。