匹配大于 40 的数字

Matching numbers greater than 40

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

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

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

感谢您的帮助。

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

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

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

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

匹配 4-9 后跟一位或多位数字。大概在这开始时有某种边界,但听起来你已经解决了那部分问题。这使用 OR 允许两组可能的第一位数字。

(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 或两位非 00 的小数。
  • 然后它会尝试匹配 4 后跟 1-9,十进制可选。
  • 如果无法匹配则匹配 5-9 后跟 0-9,十进制可选。
  • 然后尝试匹配任意数字,任意次数,后跟 1-9,后跟 1 或 2 位数字,小数点可选。

如果需要小数点,只需删除最后一个问号即可。

这样做就可以了:

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

这将得到第一个大于 4 的所有两位数字或任何三位数字的数字。

举个例子http://www.regexr.com/3a5v0

这应该可以完成工作:

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

在这里查看: http://www.regexr.com/3a5v9

如果您的正则表达式风格可以使用负向回顾来匹配从 41 到 9999 的不带小数的数字:

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

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

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

在 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 生成的自动机状态 table(它为您编写 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* 可选任意数量的前导零。
  • [4-9][0-9] 数字 40 到 99
  • [1-9][0-9]{3,} 100 及以上的数字。
  • (.[0-9]*)?可选的小数点后跟任意数字。