原字符串 String str="SUM(TA0047/(TA0012+TA0023+SUM((TA0034+TA0045))))"
程序处理过的字符串
String newStr="TA0047/(TA0012+TA0023+(TA0034+TA0045))"
目的就是去掉SUM() 或者AVG() 等等....
思路.....不清晰....求助
试一下这个
public static void main(String[] args) {
// 按指定模式在字符串查找
String line = "SUM(TA0047/(TA0012+TA0023+SUM((TA0034+TA0045))))";
String pattern = "(.*)?SUM\\((.*)\\)";
// 创建 Pattern 对象
Pattern r = Pattern.compile(pattern);
// 现在创建 matcher 对象
Matcher m = r.matcher(line);
while (m.find()) {
String s = null;
try {
//尝试获取第二个
s = m.group(2);
line = m.group(1) + m.group(2);
} catch (Exception e) {
//不存在第二个,则获取第一个
s = m.group(1);
line = m.group(1);
}
System.out.println("Found value: " + s);
m = r.matcher(line);
}
System.out.println(line);
}
直接replace SUM或者AVG为空就好了,后面的括号不影响吧。
可以循环,每次找到一个SUM(),就取出分组,一直到不存在SUM()
let ss="SUM(TA0047/(TA0012+TA0023+SUM(TA0034+TA0045)))+AVERAGE(((())))";
let removeQuo=(str,targetReg="SUM")=>{
//接收参数 SUM | AVERAGE
let matchReg=new RegExp(`(${targetReg}\\(|\\(|\\))`,'g');
let targetRegContent=`${targetReg}(`;
let leftKuo="_l_"; //左括号临时替换
let rightKuo="_r_"; //右括号临时替换
let targetRKuo="_@r_"; //SUM(右括号临时替换
let targetLKuo="_@l_"; //SUM(左括号替换
let matchSign=[0,0]; //匹配记录
let i=0;
while(str.match(matchReg)){
let matchContent=str.match(matchReg)[0];
switch(matchContent){
case targetRegContent:
matchSign=[...matchSign,1,0];
str=str.replace(matchContent,targetLKuo);
break;
case "(":
matchSign[matchSign.length-1]+=1;
str=str.replace(matchContent,leftKuo);
break;
case ")":
for(let i=matchSign.length-1;i>=0;){
if(matchSign[i]==0){
i--;
}else{
matchSign[i]--;
if(i%2){
//偶数位,匹配右括号
str=str.replace(matchContent,rightKuo);
}else{
//奇数位,匹配SUM右括号
str=str.replace(matchContent,targetRKuo);
}
break;
}
}
break;
}
i++;
if(i>1000){
console.error("公式替换出现错误");
}
}
str=str.replace(/(\_\@r\_|\_\@l\_)/g,'');
str=str.replace(/\_l\_/g,'(');
str=str.replace(/\_r\_/g,')');
return str;
}
var str="";
str=removeQuo(ss,'AVERAGE');
str=removeQuo(str,'SUM');
console.log(str)
谢谢帮助,和前端商讨学习,搞出来一个可适用的方法