如何在正则表达式中表示大于或等于 3600

如何在正则表达式中表示大于或等于 3600

我编写了这个正则表达式来匹配大于或等于 3600 的数字。这是我的尝试。不过,我不确定它是否完整:

grep -P '36[0-9]+[0-9]+[0-9]*' test.txt

我的意思只是正十进制整数(我不需要考虑浮点数、负数、八进制、十六进制、罗马数字......)。

答案1

([1-9][0-9]{2,}|[4-9][0-9]|3[6-9])[0-9]{2}如果您可以确定周围没有负数、浮点数、千限制符等,则扩展正则表达式应该可以完成这项工作

该表达式具有三个路径,所有路径的共同点是最后一部分[0-9]{2},即两位数字。

  • 第一条路径是 1 到 9,至少还有两位数字 ( [0-9]{2,}) 和那些常见的双位数,因此所有数字都具有五位或更多位:10000 及以上
  • 第二条路径是 4 到 9,再加上三位数字:4000 到 9999
  • 第三条路径是 3 和 6 到 9 以及这两个数字。这匹配 3600 到 3999 之间的所有内容

答案2

正则表达式不适合比较数字!

最好使用一些脚本语言。在你的情况下awk会做得很好:

awk -F '[^0-9]*' '{for(i=1;i<=NF;i++){ if (int($i)>3600) { print; next; } }}' test.txt

根据您的输入,您应该对此进行一些调整。
例如,我的简短示例无法正确处理负数。

答案3

使用grep

for n in $(grep -Po "[0-9]+" test); do if [ $n -ge 3600 ]; then echo $n; fi; done

如果您的文件仅有的包含整数,因为它将5999报告0.5999

或者没有if

grep -Po "[1-9][0-9]{4,}|[4-9][0-9]{3}|3[6-9][0-9]{2}" test

编辑

[1-9]从上面的 @Phillippos 那里窃取了 5 位数字的领先数字策略。答案基本相同,但我发现这更具可读性

相关内容