今天对正则表达是有了新的认识,对后端的正则表达式有了新的理解
之前一直对后台代码正则如何拿到匹配的字符串和对后台分组匹配拿到的字符串有疑问
直接上代码:
public String processFunctionToExcel(String originalFuntionStr) {
//这里添加函数类型的判断,有些类型需要添加独特的处理逻辑才可以导出公式到excel
if (originalFuntionStr.toLowerCase().contains("sumif")) {
return processWithAdapter(originalFuntionStr, (TransformFuntionForExcel<String>) functionStr -> {
//匹配"SUMIF(E11:G11,<=G13,E12:G12)"中的"<=G13"
**String pattern = "(?<=,)(>|=|<|>=|<=)([a-zA-Z]+\\d+|\\d+)(?=,)";**
Pattern p1 = Pattern.compile(pattern);
Matcher matcher = p1.matcher(functionStr);
boolean b = matcher.find();
if (b) {
// group(0)是存储的匹配到的整个字符串,后面是有几个括号()就是对应的匹配内容
**String needReplaceStr=matcher.group(0);
String firstStr = matcher.group(1);
String secondStr = matcher.group(2);**
//对应secondStr要判断是"F12"这种还是"12",前者要被替换成">"&F12,后者要替换成">12"
pattern="[a-zA-Z]+";
Matcher matcher2 = Pattern.compile(pattern).matcher(secondStr);
if (matcher2.find()) {
String newStr = new StringBuilder("\"").append(firstStr).append("\"").append("&").append(secondStr).toString();
return originalFuntionStr.replace(needReplaceStr, newStr);
} else {
StringBuilder newStr = new StringBuilder("\"").append(firstStr).append(secondStr).append("\"");
return originalFuntionStr.replace(needReplaceStr, newStr);
}
}
return originalFuntionStr;
});
}
else if (originalFuntionStr.toLowerCase().contains("vlookup")||originalFuntionStr.toLowerCase().contains("hlookup")) {
return processWithAdapter(originalFuntionStr,(TransformFuntionForExcel<String>)functionStr->{
//匹配=VLOOKUP(C9,E11:H14,2,Y)或者=HLOOKUP(C9, O4:Q7, 2,Y)中的"Y",需要换成true或者false
String pattern="(?<=,)(Y|N)(?=\\))";
Matcher matcher = Pattern.compile(pattern).matcher(originalFuntionStr);
if (matcher.find()) {
boolean result = matcher.group(0).equals("Y");
return originalFuntionStr.replaceAll(pattern,result?"true":"false");
}
return originalFuntionStr;
});
}
return originalFuntionStr;
}
上面的那个if是拿到匹配的一个小组然后对小组的字符串操作,后面用replace函数替换原来的字符串,后面的if是直接用replaceAll函数替换匹配项字符串,java里面正通过则匹配到字符串然后修改原来的字符串再替换原来的字符串是上面那个if,下面那个if是直接匹配然后替换。
public String processExcelFunction(String excelFuntionStr) {
if (excelFuntionStr.toLowerCase().contains("sumif")) {
**String pattern="(?<=,)\"(<|<=|=|>|>=)((\"&([a-zA-Z]+\\d+))|(\\d+)\")(?=,)";**
//用来匹配两种格式"SUMIF(E11:G11,"<=13",E12:G12)"中的'"<=13"'或者"SUMIF(E11:G11,"<="&G13,E12:G12)"中的'"<="&G13'
Matcher matcher = Pattern.compile(pattern).matcher(excelFuntionStr);
boolean b = matcher.find();
if (b) {
String needReplaceStr=matcher.group(0);
if (matcher.group(4) != null) {
//"SUMIF(E11:G11,"<=13",E12:G12)" this case
String firstStr = matcher.group(1);
String secondStr=matcher.group(4);
return excelFuntionStr.replace(needReplaceStr,firstStr+secondStr);
} else if (matcher.group(5) != null) {
//"SUMIF(E11:G11,"<=13",E12:G12)" this case
String firstStr = matcher.group(1);
String secondStr=matcher.group(5);
return excelFuntionStr.replace(needReplaceStr,firstStr+secondStr);
}
}
} else if (excelFuntionStr.toLowerCase().contains("vlookup")||excelFuntionStr.toLowerCase().contains("hlookup")) {
}
return excelFuntionStr;
}
这里主要说下这个正则表达式, String pattern="(?<=,)"(<|<=|=|>|>=)(("&([a-zA-Z]+\d+))|(\d+)")(?=,)";
(?<=,) 的意思是这里看匹配字符串"(<|<=|=|>|>=)(("&([a-zA-Z]+\d+))|(\d+)")的前面有没有’,’,(概念是正向预查,不过正宗的正向预查是(?=exp),负向预查是(?!=exp)),
后面的(?=,)就是要以’,'结尾。中间匹配字符串首先是比较符号<>=,然后是&加多个字母加数字或者多个数字。关键点在括号分组。Match.group(0)默认的是整个你匹配到的字符串,然后就开始按照你自己建立的括号顺序来排group的序号,tips:我这个正则的环视(就是正向预查或者负向预查)的括号是不算入其中的。第一个(<|<=|=|>|>=);第二个(("&([a-zA-Z]+\d+))|(\d+)"),第三个("&([a-zA-Z]+\d+)),第四个(\d+)"),再加上group(0)一共五个组,同时要注意在java中如果这个组没有匹配到那么相对应的字符串,那么match.group(i)=null。
参考:https://www.cnblogs.com/mainz/archive/2009/03/14/1411359.html
好久没写过日志了,刚开始上班的时候很勤奋,现在有机会就划水。哎,我觉得不是特别适合当程序员但是又不晓得敲代码以外自己能干什么