需求:使用正则表达式去匹配数字的比较运算符
例:
- 过滤出所有小于18的数字字符串:
- 正则表达式为:
^18\.\d*[1-9]+\d*$|^[1-9]\d{2,}(?:|\.\d+)$|^[2-9]\d{1}(?:|\.\d+)$|^1[9-9](?:|\.\d+)$
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
/**
* 根据输入数字,转换比较运算符的正则表达式
*
* 例:
* < 55.06 正则表达式为:^-\d+(?:|\.\d+)$|^(?:|[0-4])\d{1,1}(?:|\.\d+)$|^5[0-4](?:|\.\d+)$|^55(?:|\.[0]+)$|^55\.0(?:|[0-5]\d*)$
* > -8.3 正则表达式为:^\d+(?:|\.\d+)$|^-(?:|[0-7])(?:|\.\d+)$|^-8(?:|\.[0-2]\d*)$
* > 18 正则表达式为:^18\.\d*[1-9]+\d*$|^[1-9]\d{2,}(?:|\.\d+)$|^[2-9]\d{1}(?:|\.\d+)$|^1[9-9](?:|\.\d+)$
* < -13 正则表达式为:^-[1-9]\d{2,}(?:|\.\d+)$|^-[2-9]\d{1}(?:|\.\d+)$|^-1[4-9](?:|\.\d+)$|^-13\.\d*[1-9]+\d*$
*
* 整体思路:
* 针对全体非负数:
* 小于当前数字所有位数的数字;从高位向低位遍历,遇到0特殊处理;截取前面数字,和小于当前位数字,后面是任意数字,总体长度要和给定数字相等
* 大于当前数字所有位数的数字;从高位向低位遍历,遇到9特殊处理;截取前面数字,和大于当前位数字,后面是任意数字,总体长度要和给定数字相等
* 当针对小数时,要多大考虑小数后面的非零数字的特性。
* 当遇到负数时,转换为正数进行计算。
*
* @author WeiJinglun
* @date 2019/10/22
*/
public class RegexTool {
/**
* 小于指定数字的正则表达式
*/
public static String transformLessNumber(String s) {
StringBuilder sb = new StringBuilder();
if (NumberUtil.parseNumber(s).doubleValue() < 0) {
//负数
s = s.substring(1);
String[] split = delZero(s.split("\\."));
if (split.length == 1) {
//整数
transformGreaterInteger("-", split[0], sb);
sb.append("|^-").append(split[0]).append("\\.\\d*[1-9]+\\d*$");
} else if (split.length == 2) {
//小数
transformGreaterDouble("-", split, sb);
sb.append("|^-").append(split[0]).append("\\.").append(split[1]).append("\\d*[1-9]+\\d*$");
}
} else {
//正数
String[] split = delZero(s.split("\\."));
//添加负数
sb.append("^-\\d+(?:|\\.\\d+)$");
if (split.length == 1) {
//整数
transformLessInteger("", split[0], sb);
} else if (split.length == 2) {
//小数
transformLessDouble("", split, sb);
}
}
return sb.toString();
}
/**
* 小于等于指定数字的正则表达式
*/
public static String transformLessOrEqualNumber(String s) {
StringBuilder sb = new StringBuilder();
if (NumberUtil.parseNumber(s).doubleValue() < 0) {
//负数
s = s.substring(1);
String[] split = delZero(s.split("\\."));
if (split.length == 1) {
//整数
sb.append("^-").append(split[0]).append("(?:|\\.\\d+)$|");
transformGreaterInteger("-", split[0], sb);
} else if (split.length == 2) {
//小数
sb.append("^-").append(split[0]).append("\\."