正则group分组提取关键信息

109 阅读1分钟

需求

有个excel导入需求,有一列信息是:5<值域范围<8这种的表达式,需要解析成表达式(5,8)

值域范围<18,解析成(,18), 1<=值域范围<=5,解析成[1,5]。简单粗暴的方式可能是用

<、<=、>、>=号切割字符串,然后进行字符切割。

实现

下面用正则的分组,实现这个功能

正则表达式: ([^<=<])(<=|<)值域范围(<=|<)(.)

group(0) 匹配完整的正则表达式,group(1)匹配第一个括号内的表达是。

([^<=<])(<=|<)值域范围(<=|<)(.) 的意思:第一个括号匹配非<=和<的值,以3<值域范围<5为例子,

group(1)=3,group(2)= <,group(3)=<,group(4)=5

public class test {

public static void main(String[] args) {
    String val ="'2024-01-05 08:00:00'<=值域范围<='2024-01-05 09:00:00'";
    tranfBds(val);
}

public static String tranfBds(String  val){
    String newval = "";
    //val ="<=值域范围<=4";
    val = val.trim().replace("\r", "").replace("\n", "");
    String pattern = "([^<=<]*)(<=|<)*值域范围(<=|<)*(.*)";
    if (!val.matches(pattern)) {
        System.out.println("不匹配val");
    }else {
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(val);
        if (m.find())
        {
            String leftdata =  m.group(1);
            String leftfh = transfh("left", m.group(2));
            String rightfh = transfh("right", m.group(3));
            String rightdata =   m.group(4);
            newval  = leftfh + leftdata + ","+ rightdata+ rightfh;
            System.out.println(newval);
        }

    }
    return newval;
}


/**
 * 符号转换
 * @param sx
 * @param fh
 * @return
 */
public static String transfh(String sx, String fh){
    if (StringUtils.isNotEmpty(fh)){
        if (fh.equalsIgnoreCase("<")){
            if (sx.equalsIgnoreCase("left"))
                return "(";
            else
                return ")";
        }else if (fh.equalsIgnoreCase("<=")){
            if (sx.equalsIgnoreCase("left"))
                return "[";
            else
                return "]";
        }
    }else {
        if (sx.equalsIgnoreCase("left"))
            return "(";
        else
            return ")";
    }
    return  "";
}

}

原文链接:blog.csdn.net/s07aser123/…