使用正则表达式,表达数字的比较运算符

时间:2025-02-14 22:51:48
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("\\.").append(split[1]).append("\\d*$|"); transformGreaterDouble("-", split, sb); } } else { //正数 String[] split = delZero(s.split("\\.")); //添加负数 sb.append("^-\\d+(?:|\\.\\d+)$|"); if (split.length == 1) { //整数 transformLessInteger("", split[0], sb); sb.append("|^").append(split[0]).append("(?:|\\.\\d+)$"); } else if (split.length == 2) { //小数 transformLessDouble("", split, sb); sb.append("|^").append(split[0]).append("\\.").append(split[1]).append("\\d*$"); } } return sb.toString(); } /** * 大于指定数字的正则表达式 */ public static String transformGreaterNumber(String s) { StringBuilder sb = new StringBuilder(); if (NumberUtil.parseNumber(s).doubleValue() < 0) { //负数 s = s.substring(1); 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); } } else { //正数 String[] split = delZero(s.split("\\.")); if (split.length == 1) { //整数 sb.append("^").append(split[0]).append("\\.\\d*[1-9]+\\d*$|"); transformGreaterInteger("", split[0], sb); //添加小数大于整数部分 } else if (split.length == 2) { //小数 sb.append("^").append(split[0]).append("\\.").append(split[1]).append("\\d*[1-9]+\\d*$|"); transformGreaterDouble("", split, sb); } } return sb.toString(); } /** * 大于或等于指定数字的正则表达式 */ public static String transformGreaterOrEqualNumber(String s) { StringBuilder sb = new StringBuilder(); if (NumberUtil.parseNumber(s).doubleValue() < 0) { //负数 s = s.substring(1); String[] split = delZero(s.split("\\.")); //添加所有正数 sb.append("^\\d+(?:|\\.\\d+)$"); if (split.length == 1) { //整数 transformLessInteger("-", split[0], sb); sb.append("|^-").append(split[0]).append("(?:|\\.\\d+)$"); } else if (split.length == 2) { //小数 transformLessDouble("-", split, sb); sb.append("|^-").append(split[0]).append("\\.").append(split[1]).append("\\d*$"); } } else { //正数 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("\\.").append(split[1]).append("\\d*$|"); transformGreaterDouble("", split, sb); } } return sb.toString(); } /** * 等于指定数字的正则表达式 */ public static String transformEqualNumber(String s) { String[] split = delZero(s.split("\\.")); StringBuilder sb = new StringBuilder(); if (split.length == 1) { //整数 sb.append("^").append(split[0]).append("(?:|\\.[0]+)$"); } else if (split.length == 2) { //小数 sb.append("^").append(split[0]).append("\\.").append(split[1]).append("[0]*$"); } return sb.toString(); } /** * 转换大于整数的正则表达式 */ private static void transformGreaterInteger(String sign, String s, StringBuilder sb) { //先添加高于给定数字位数的条件 sb.append("^").append(sign).append("[1-9]\\d{").append(s.length()).append(",}(?:|\\.\\d+)$"); for (int i = 0; i < s.length(); i++) { int n = Integer.parseInt(s.substring(i, i + 1)); if (n != 9) { String pre = s.substring(0, i); int num = s.length() - 1 - i; sb.append("|^").append(sign).append(pre).append("[").append(n + 1); if (num == 0) { sb.append("-9]").append("(?:|\\.\\d+)$"); } else { sb.append("-9]\\d{").append(num).append("}(?:|\\.\\d+)$"); } } } } /** * 转换大于浮点类型数字的正则表达式 */ private static void transformGreaterDouble(String sign, String[] split, StringBuilder sb) { String s1 = split[0]; //先转换整数部分 transformGreaterInteger(sign, s1, sb); //在转换小数部分 String s2 = split[1]; for (int i = 0; i < s2.length(); i++) { int n = Integer.parseInt(s2.substring(i, i + 1)); if (n != 9) { String pre = s2.substring(0, i); sb.append("|^").append(sign).append(s1).append("\\.").append(pre).append("[").append(n + 1).append("-9]\\d*$"); } } } /** * 转换小于整数的正则表达式 */ private static void transformLessInteger(String sign, String s, StringBuilder sb) { for (int i = 0; i < s.length(); i++) { int n = Integer.parseInt(s.substring(i, i + 1)); if (n == 0) { continue; } sb.append("|^").append(sign); if (i > 0) { String pre = s.substring(0, i); sb.append(pre).append("[0-").append(n - 1).append("]"); } else { if (n == 1) { sb.append("(?:|[0])"); } else { sb.append("(?:|[0-").append(n - 1).append("])"); } } int num = s.length() - i - 1; if (num == 0) { sb.append("(?:|\\.\\d+)$"); } else { sb.append("\\d{1,").append(num).append("}(?:|\\.\\d+)$"); } } } /** * 转换小于浮点类型数字的正则表达式 */ private static void transformLessDouble(String sign, String[] split, StringBuilder sb) { String s1 = split[0]; //先转换整数部分 transformLessInteger(sign, s1, sb); //在转换小数部分 String s2 = split[1]; for (int i = 0; i < s2.length(); i++) { int n = Integer.parseInt(s2.substring(i, i + 1)); if (i > 0) { String pre = s2.substring(0, i); sb.append("|^").append(sign).append(s1).append("\\.").append(pre); if (n != 0) { sb.append("(?:|[0-").append(n - 1).append("]\\d*)$"); } else { sb.append("[0]*$"); } } else { sb.append("|^").append(sign).append(s1); if (n == 0) { sb.append("(?:|\\.[0]+)$"); } else { sb.append("(?:|\\.[0-").append(n - 1).append("]\\d*)$"); } } } } /** * 去除数字小数点后,无效的0 */ private static String[] delZero(String[] split) { if (split.length == 1) { return split; } else if (split.length == 2) { String s = split[1]; int i = Integer.parseInt(StrUtil.reverse(s)); if (i == 0) { return new String[]{split[0]}; } split[1] = StrUtil.reverse(String.valueOf(i)); return split; } return null; } }