java正则表达式匹配包括小数在内的所有数字

正则表达式

解释

  1. [1-9] :匹配1~9的数字;
  2. \d :匹配数字,包括0~9;
  3. * :紧跟在 \d 之后,表明可以匹配零个及多个数字;
  4. . :匹配小数点;
  5. ? :紧跟在 . 之后,表明可以匹配零个或一个小数点;
  6. 0 :匹配一个数字0;
  • [1-9]\d*\.?\d* 匹配诸如:1、23、34.0、56.78 之类的非负的整数和浮点数
  • 0\.\d*[1-9] 匹配诸如:0.1、0.23、0.405 之类的非负浮点数
  • ([1-9]\d*\.?\d*)|(0\.\d*[1-9]) 可以匹配带小数点的数字

0

利用正则表达式快速匹配字符串里${xxx}里的内容

我们在开发一些模板文件的时候,经常需要查找赋值标签里的内容。

例如,模板如下。

代码

0

为什么一个不起眼的正则表达式会导致CPU飙升

问题复现

本文记录一个正则表达是导致 CPU 高的问题排查。具体代码如下:

当运行程序的时候,我们可以看到 java 的进程占用了 CPU 了 82.1%,由于我使用的服务器是 1核+2G, 所以 load avg 占用也很高。

使用 top -H -p 4214 查看各个线程占用的情况

使用 printf '%x\n' 4217 把进程转成 16 进制值为 1079。执行 jstack 4214|grep 1079 -A 100得到线程的堆栈信息:

从上面的堆栈信息可以看出来是正则的递归调用,导致了很深的堆栈。
查看最终的堆栈入口:at org.rz.search.spider.AppMain.main(AppMain.java:13) 可以断定问题是正则匹配的原因。

为什么一个正则会导致CPU飙高?

我们知道,正则一般都是采用贪婪的模式,如果当前字符串不匹配,会导致字符回溯,如果待匹配串过长就会导致匹配的次数成指数上升。

推荐一个正则表达式的性能测试网站,https://regex101.com/

使用简单的数据匹配,比较此时已经达到了 168997次。

我再次增加了两个字符,比较次数已经增到 404895次。

当然,如果能匹配成功,则匹配的次数非常少

解决思路

所以以后使用正则的时候,应该多多注意,具体这个怎么解决,还是要根据业务场景来具体实施,可以使用一个简单的过滤规则,把明显有问题的字符先去除

在本例中就可以直接先判断字符是否包含非法字符 #,$,-,?…等,然后再使用正则再次匹配。

0

java里如何验证email邮件地址?

java里如何验证email邮件地址?

1.使用正则表达式

2.使用commons-validator包提供的方法

pom依赖

验证使用

0