我正在尝试匹配大于40的数字。好处是它们都有2个小数位,所以它们都是:3.25,5.89,999.75并且它们不使用任何前导零(除了在小数部分,总是有2位数))... 起初我尝试了以下代码但后来我意识到这不会匹配100,1000这样的数字......即使它们大于40也是如此。
[4-9][0-9]\.
我不必匹配小数部分,所以不要担心匹配,只是帮我找到如何匹配大于40的数字(最多9999就可以了)。
感谢您的帮助。
答案 0 :(得分:6)
答案 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的误报。
这对我有用。
如果您想要小数,只需删除最后一个问号。
答案 4 :(得分:1)
答案 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 -Po
或Perl
一起使用:
'\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的数字:
%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]*)?
说明: