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

需求:使用正则表达式去匹配数字的比较运算符

例:

  • 过滤出所有小于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("\\.").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;
    }
}

pom依赖添加第三方hutool工具类

        <dependency>
            <groupId>cn.hutoolgroupId>
            <artifactId>hutool-allartifactId>
            <version>5.0.1version>
        dependency>

注:本代码,仅供公司内部使用,如有bug,可在评论回复。如果能给您的项目代码带来帮助,那定是极好的。

你可能感兴趣的:(算法,正则,比较,数字,大于,小于)