需求
有个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
*/
/**
* 符号转换
* @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 "";
}
}