正则或者其他方法去除指定的字符或串

题目描述

一段字符串,中多个重复出现的字符,要去掉,但是不知道相关的正则方法

相关代码

    String ss="SUM(TA0047/(TA0012+TA0023+SUM(TA0034+TA0045)))";

你期待的结果是什么?实际看到的错误信息又是什么?

结果就是 TA0047/(TA0012+TA0023+TA0034+TA0045)

问题描述

去掉 SUM() java的api replace 或者replaceAll 只能去掉SUM 但是括号的位置是不固定的。目前没想到怎么做。 解析成char 之后循环查询标记位置,但是思路不清晰。求助

阅读 2.5k
2 个回答

正则就放弃吧,基本不可能。
我不太熟悉java,用javascript实现了一版,采用正则加递归,原理:

  1. 每次找到最内层的一对括号,确定这对括号是不是 SUM的

    1. 如果是SUM的,那么移除SUM()
    2. 如果不是SUM的,那么将这对括号使用 自定义的替代符号 临时替换掉,目的是为了下轮递归时,继续往外扩展找次外层的小括号对。
  2. 等全部处理完后,将左右括号的占位符替换会左右小括号即可得到需要的字符串。
var s = "SUM(TA0047/(TA0012+TA0023+SUM(TA0034+TA0045)))";
var reg = /\([^\(\)]+\)/; //正则,匹配最内层的一对括号
var targetFunctionName = "SUM";
var leftParenthesePlaceholder = "@@="; //左小括号占位符
var rightParenthesePlaceholder = "=@@"; //右小括号占位符


function fooWrapper(targetStr, targetFunctionName) {
    var targetLength = targetFunctionName.length;
    var str = targetStr + ''; //复制一个字符串,不影响参数对应的原字符串
    return foo(str,targetLength).replace(leftParenthesePlaceholder, "(")
                                .replace(rightParenthesePlaceholder, ")");
}


function foo(str, targetLength) {
    if(reg.test(str)) {
        var match = str.match(reg); //返回匹配到结果集对象
        var matchStartIndex = match.index; //最内层括号的左括号对应的index
        var matchEndIndex = match[0].length + matchStartIndex - 1;
        var targetStart = matchStartIndex-targetLength < 0 ? 0 : matchStartIndex-targetLength; //向前找看能否找到SUM,即当前左括号是SUM的,那么就想办法去掉这层括号。
    var isFoundTarget = str.substr(targetStart, targetLength) === targetFunctionName;
    if(isFoundTarget) {
        var strToArr = str.split(''); //将目标字符串转为数组
        strToArr.splice(targetStart, targetLength + 1); //移除数组中 FunctionName(
        strToArr.splice(matchEndIndex - targetLength - 1, 1); //因为strToArr已经被上面这步改变了,对应的结束右括号index前移
        str = strToArr.join('');
    } else {  //如果不是SUM对应的括号对,将他们用占位符替换掉
        str = str.substring(0, matchStartIndex) 
                    + leftParenthesePlaceholder
                    + str.substring(matchStartIndex + 1, matchEndIndex)
                    + rightParenthesePlaceholder
                    + str.substring(matchEndIndex + 1);
    }
        return foo(str, targetLength);
    } else {
        return str;
    }
}


var result = fooWrapper(s, targetFunctionName);
console.log(result);

因你没有说明 js 字符串的具体用法,这里假设你是用 java 生成动态的 javascript 脚本(字符串),然后用 node.js 之类的 javascript 引擎执行。

  1. 首先我不赞成替换/删除字符串SUM() 的处理方式,因它需要考虑太多因素,基本上你要做一个 javascript 语法分析器才能正确实现,比如以下情况

    let r = SUM(a+b)/c;
    const CHECKSUM = 100;
    let log = "SUM(1+2)?";
  2. 若只需要考虑算术运算(加减乘除),即当 SUM(a) 结果等于 (a) 时,可直接删除 SUM,保留括号。
  3. 若考虑完整的 javascript 运行环境,可植入一段 SUM 定义函数,如

    function SUM(n) {
      return n;
    }

    这样原字符串便不需要修改。Java 示例

    String injectScript = "function SUM(n) {return n;};";
    String ss="SUM(TA0047/(TA0012+TA0023+SUM(TA0034+TA0045)))";
    jsExec(injectScript + ss);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题