论坛里有这么个提问:如何在字符串里找到自定义公式,字符串类似 “355/113+JE((2+2)2,3(2+1))*7-21”, 然后在里面找到自定义的公式"JE((2+2)2,3(2+1))"。看到问题第一想法就是能不能用正则表达式,限于本人对正则不是特精通,对正则在匹配对称字符方面不是很了解,就投降了,那就写个简单的解析函数来实现吧。
1、思路
这个问题我若没记错的话,应该学习数据结构时讲过的,应该是用栈实现的,后进先出,及先放左括号,然后解析到右括号时,左括号弹出,然后判断栈是否为空,为空则表示完成解析。
JavaScript没有栈,那就用一个空字符串表示吧,var brackets = ‘’,具体步骤:
1)找到左括号,brackets += ‘(’;
2)找到右括号,分两步:
- brackets 去掉最后一个左括号;
- 判断brackets是否为空字符串,为空则解析结束
2、js代码
function parseFormula(str, formular) {
var result = '', pos = str.indexOf(formular+'('), brackets = "";
if(pos > -1) {
str = str.substring(pos);
for(var i = 0, l = str.length; i<l; i++) {
if(str[i] == '(') { //str[i] == ')'
brackets += str[i]
} else if(str[i] == ')'){
if((pos = brackets.lastIndexOf('(')) > -1) {
brackets = brackets.substring(0, brackets.length - 1);
if(brackets == "") {
result = str.substring(0, i+1);
break;
}
}
}
}
}
return result;
}
var str = '355/113+JE((2+2)*2,3*(2+1))*7-21';
var str2 = '355/113+JE(1-2*3(1-2)+2)*7-21';
console.log(parseFormula(str, 'JE')); //JE((2+2)*2,3*(2+1))
console.log(parseFormula(str2, 'JE')); //JE(1-2*3(1-2)+2)
3、总结
正则熟练的话,能用正则实现还是建议正则实现,简单、灵活。
上述只是一个建议方案,当然可以用其它方法来实现,只要能解决问题就OK。