匹配数字大于40

时间:2015-01-06 22:12:54

标签: regex

我正在尝试匹配大于40的数字。好处是它们都有2个小数位,所以它们都是:3.25,5.89,999.75并且它们不使用任何前导零(除了在小数部分,总是有2位数))... 起初我尝试了以下代码但后来我意识到这不会匹配100,1000这样的数字......即使它们大于40也是如此。

[4-9][0-9]\.

我不必匹配小数部分,所以不要担心匹配,只是帮我找到如何匹配大于40的数字(最多9999就可以了)。

感谢您的帮助。

8 个答案:

答案 0 :(得分:6)

这应该做的工作:

([4-9][0-9]|\d{3,})\.

在此处查看: http://www.regexr.com/3a5v9

答案 1 :(得分:4)

不要使用正则表达式进行数字比较。例如,如果您使用的是Javascript:

var aNumber = parseFloat("50");
if (aNumber > 40) {
    // yay!
}

答案 2 :(得分:1)

您可以使用括号指示最小值,如果需要,还可以指定要匹配的最大字符数。所以,

([4-9][0-9]|[1-9][0-9]{2,})\.

匹配4-9后跟一个或多个数字。据推测,在这个开头有某种界限,但听起来你已经解决了这个问题。这使用OR来允许两个可能的第一个数字组。

答案 3 :(得分:1)

(40\.(?!0[^\d]|00)\d{1,2}|(((4[1-9](?!\d)|[5-9][0-9])(?![\d])|\d*[1-9]\d{2,})(\.\d{1,2})?))

这可以防止前导0的误报。

这对我有用。

  • 它会尝试匹配40后跟1或2个非00的小数。
  • 然后尝试匹配4,然后是1-9,十进制可选。
  • 如果不匹配则匹配5-9后跟0-9,十进制可选。
  • 然后triese匹配任何数字,任意次数,然后是1-9,然后是1或2位数,十进制可选。

如果您想要小数,只需删除最后一个问号。

答案 4 :(得分:1)

这样做:

([4-9][0-9]+|\d{3,})

这将获得两个数字的所有数字,其中第一个数字大于4或任何数字具有三个数字。

作为示例http://www.regexr.com/3a5v0

答案 5 :(得分:1)

如果你的正则表达式可以使用负向lookbehind来匹配41到9999之间没有小数的数字:

\b(?:[1-9][0-9]{2,3}|[5-9][0-9]|4[1-9])(?<!\.\d{1,2})\b

答案 6 :(得分:0)

(大多数其他答案对我来说都很完美 - 这是偏执狂和一个坏主意:)

与我们可以使用的grep -PoPerl一起使用:

'\b(\d{3,}|[4-9]\d)\.\d\d'

但这会得到40.00(不超过40)

'\b(\d{3,}|[5-9]\d|4[1-9])\.\d\d|\b40\.\d?[1-9]\d?'

对应于:

     DDD.DD 
| [5-9]D.DD
| 4[1-9].DD 
|     40.D[1-9] 
|     40.[1-9]D

答案 7 :(得分:0)

在flex(1)中,你有这个代码来解析字符串并获得大于40的数字:

pru.l:

%option noyywrap
%%
\+?(0*[4-9][0-9]|0*[1-9][0-9][0-9][0-9]*)(\.[0-9]*)?  { printf("Greater than 40: %s\n", yytext); }
\-?[0-9]*(\.[0-9]*)?                                { printf("Lesser than 40: %s\n", yytext); }
\n                                                |
.                                                 ;
%%

int main()
{ yylex(); }

安装 flex 并使用

编译此文件
make pru

然后将其运行为:

pru <filein >fileout

或只是

pru

此代码根据列出的正则表达式构造确定性有限自动机,并在识别大于40的值时打印右侧列出的命令。它允许前导可选符号和前导零,以及由任意数字组成的可选小数部分的数字。并且它只对每个字符读取一个对齐和一个决定。您可以访问flex生成的自动机状态表(它为您编写C代码)

识别大于40的数字(带小数和前导符号和零)的正则表达式是:

\+?(0*[4-9][0-9]|0*[1-9][0-9][0-9][0-9]*)(\.[0-9]*)?

可以删除为:

\+?(0*[4-9][0-9]|0*[1-9][0-9]{3,})(\.[0-9]*)?

说明:

  • \ +?匹配可选的加号。
  • (... | ...)两个选项:
  • 0 *可选的任意数量的leadin零。
  • [4-9] [0-9]数字40至99
  • [1-9] [0-9] {3,}数字100及以上。
  • ([0-9] *)?可选的小数点后跟任意位数。