在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Java  HTML/ 正則或者其他方法去除指定的字符或串

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

題目描述

一段字符串,中多個(gè)重復(fù)出現(xiàn)的字符,要去掉,但是不知道相關(guān)的正則方法

相關(guān)代碼

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

你期待的結(jié)果是什么?實(shí)際看到的錯(cuò)誤信息又是什么?

結(jié)果就是 TA0047/(TA0012+TA0023+TA0034+TA0045)

問(wèn)題描述

去掉 SUM() java的api replace 或者replaceAll 只能去掉SUM 但是括號(hào)的位置是不固定的。目前沒(méi)想到怎么做。 解析成char 之后循環(huán)查詢(xún)標(biāo)記位置,但是思路不清晰。求助

回答
編輯回答
純妹

因你沒(méi)有說(shuō)明 js 字符串的具體用法,這里假設(shè)你是用 java 生成動(dòng)態(tài)的 javascript 腳本(字符串),然后用 node.js 之類(lèi)的 javascript 引擎執(zhí)行。

  1. 首先我不贊成替換/刪除字符串SUM() 的處理方式,因它需要考慮太多因素,基本上你要做一個(gè) javascript 語(yǔ)法分析器才能正確實(shí)現(xiàn),比如以下情況

    let r = SUM(a+b)/c;
    const CHECKSUM = 100;
    let log = "SUM(1+2)?";
  2. 若只需要考慮算術(shù)運(yùn)算(加減乘除),即當(dāng) SUM(a) 結(jié)果等于 (a) 時(shí),可直接刪除 SUM,保留括號(hào)。
  3. 若考慮完整的 javascript 運(yùn)行環(huán)境,可植入一段 SUM 定義函數(shù),如

    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);
2017年2月6日 11:14
編輯回答
任她鬧

正則就放棄吧,基本不可能。
我不太熟悉java,用javascript實(shí)現(xiàn)了一版,采用正則加遞歸,原理:

  1. 每次找到最內(nèi)層的一對(duì)括號(hào),確定這對(duì)括號(hào)是不是 SUM的

    1. 如果是SUM的,那么移除SUM()
    2. 如果不是SUM的,那么將這對(duì)括號(hào)使用 自定義的替代符號(hào) 臨時(shí)替換掉,目的是為了下輪遞歸時(shí),繼續(xù)往外擴(kuò)展找次外層的小括號(hào)對(duì)。
  2. 等全部處理完后,將左右括號(hào)的占位符替換會(huì)左右小括號(hào)即可得到需要的字符串。
var s = "SUM(TA0047/(TA0012+TA0023+SUM(TA0034+TA0045)))";
var reg = /\([^\(\)]+\)/; //正則,匹配最內(nèi)層的一對(duì)括號(hào)
var targetFunctionName = "SUM";
var leftParenthesePlaceholder = "@@="; //左小括號(hào)占位符
var rightParenthesePlaceholder = "=@@"; //右小括號(hào)占位符


function fooWrapper(targetStr, targetFunctionName) {
    var targetLength = targetFunctionName.length;
    var str = targetStr + ''; //復(fù)制一個(gè)字符串,不影響參數(shù)對(duì)應(yīng)的原字符串
    return foo(str,targetLength).replace(leftParenthesePlaceholder, "(")
                                .replace(rightParenthesePlaceholder, ")");
}


function foo(str, targetLength) {
    if(reg.test(str)) {
        var match = str.match(reg); //返回匹配到結(jié)果集對(duì)象
        var matchStartIndex = match.index; //最內(nèi)層括號(hào)的左括號(hào)對(duì)應(yīng)的index
        var matchEndIndex = match[0].length + matchStartIndex - 1;
        var targetStart = matchStartIndex-targetLength < 0 ? 0 : matchStartIndex-targetLength; //向前找看能否找到SUM,即當(dāng)前左括號(hào)是SUM的,那么就想辦法去掉這層括號(hào)。
    var isFoundTarget = str.substr(targetStart, targetLength) === targetFunctionName;
    if(isFoundTarget) {
        var strToArr = str.split(''); //將目標(biāo)字符串轉(zhuǎn)為數(shù)組
        strToArr.splice(targetStart, targetLength + 1); //移除數(shù)組中 FunctionName(
        strToArr.splice(matchEndIndex - targetLength - 1, 1); //因?yàn)閟trToArr已經(jīng)被上面這步改變了,對(duì)應(yīng)的結(jié)束右括號(hào)index前移
        str = strToArr.join('');
    } else {  //如果不是SUM對(duì)應(yīng)的括號(hào)對(duì),將他們用占位符替換掉
        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);
2017年10月13日 09:57