正则加递归去除指定的多个字符

原字符串 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)


谢谢帮助,和前端商讨学习,搞出来一个可适用的方法