一段字符串,中多個(gè)重復(fù)出現(xiàn)的字符,要去掉,但是不知道相關(guān)的正則方法
String ss="SUM(TA0047/(TA0012+TA0023+SUM(TA0034+TA0045)))";
結(jié)果就是 TA0047/(TA0012+TA0023+TA0034+TA0045)
去掉 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í)行。
首先我不贊成替換/刪除字符串SUM() 的處理方式,因它需要考慮太多因素,基本上你要做一個(gè) javascript 語(yǔ)法分析器才能正確實(shí)現(xiàn),比如以下情況
let r = SUM(a+b)/c;
const CHECKSUM = 100;
let log = "SUM(1+2)?";
SUM(a) 結(jié)果等于 (a) 時(shí),可直接刪除 SUM,保留括號(hào)。若考慮完整的 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);
正則就放棄吧,基本不可能。
我不太熟悉java,用javascript實(shí)現(xiàn)了一版,采用正則加遞歸,原理:
每次找到最內(nèi)層的一對(duì)括號(hào),確定這對(duì)括號(hào)是不是 SUM的
SUM(和)
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);北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。