as3.0
为了方便,我们先定义一个变量,并给它一个值——中文字符型算式:
var formula:String='{[[[(20+3)*5]]]-10-2.5}/ 2.5×(1134-500÷4)=';
我们需要的效果是:
var result:String='(((((20+3)*5)))-10-2.5)/2.5*(1134--500/4)”;
实现的方法细述如下:
穷尽式逐项替换法。 穷尽可能出现的情况,再用正则表达式匹配一个或多个替换项。因为字符型中文算式可能出现的情况为数不多,可以很容易地枚举。 function replace(str:String ):String { formula = str.replace(/[\[\{{[(]/g,'(')//统一为英文左括号 str = str.replace(/[\]\}}])]/g,')')//统一为英文右括号 str = str.replace(/×/g,'*'); str= str.replace(/÷/g,'/'); str= str.replace(/[== ]/g,'');//去掉空格和等号 str= str.replace(/./g,'.'); str= str.replace(/0/g,0); str= str.replace(/1/g,1); str= str.replace(/2/g,2); str= str.replace(/3/g,3); str= str.replace(/4/g,4); str= str.replace(/5/g,5); str= str.replace(/6/g,6); str= str.replace(/7/g,7); str= formula.replace(/8/g,8); formula= formula.replace(/9/g,9); return str } 测试一下: trace(formula=replace(formula)); 结果是符合要求的: (((((20+3)*5)))-10-2.5)/2.5*(1134-500/4) 如果把替换与被替换的内容估成数组,使用循环赋值,岂不可以大大简化代码?我们试下:varsymbol:Array=['+','-','*','/','(',')','(',')','(',')','(',')','(',')','.','0','1','2','3','4','5','6','7','8','9','','','',''];var char:Array=['+','-','×','÷','(',')','[',']','[',']','{','}','{','}','.','0','1','2','3','4','5','6','7','8','9','=','=',' ','',];//...标准化算式...去中文字符、等号、空格...................function replace(str:String ):String {var k:uint=symbol.length;for (var j:uint =0; j
分离字符串逐一替换法。 仍旧利用上面的两个数组做为替换与被替换的内容。构建带有参数、有返回值的函数如下: //...标准化算式...去中文字符、等号、空格.....replace:替换..............function replace(str:String ):String {varstring:String='';vark:uint=symbol.length;varn:uint=str.length;for(var t:uint =0; t
自定义字典替换法。 你有过“暴力破解”共享软件的经历吗?如果有过,那你一定知道“字典工具”。下面我们模拟“字典工具”做一个格式化算式的函数。在思想上,就是把中文算式看作是一个有序的密码,通过我们的编码字典来解释它,还原它的本来面目。有趣吧?var formula:String='{[[[(20+3)*5]]]-10-2.5}/ 2.5×(1134-500÷4)=';varsymbol:Array=['+','-','*','/','(',')','+','-','*','/','(',')','(',')','(',')','(',')','(',')','.','0','1','2','3','4','5','6','7','8','9','.','0','1','2','3','4','5','6','7','8','9','','','',''];//谜底var char:Array=['+','-','×','÷','(',')','+','-','*','/','(',')','[',']','[',']','{','}','{','}','.','0','1','2','3','4','5','6','7','8','9','.','0','1','2','3','4','5','6','7','8','9','=','=',' ',''];//谜面var dic:Array=[];//字典function makeDic() {//制作字典vark:uint=symbol.length;for(var t:uint =0; t
自定义“类”之一劳永逸法。 上面三种都是成熟的代码,都可以封装成类。以第三个办法为例: 这个类:在Lir包中,类名:Formula;构造函数为空;静态方法:replace,有一个参数,接受字符型中文算式。函数有返回值:英文字符型标准算式。 有了这个类,实在是太好了,应用起来大大地方便了。在时间轴上输入下面的代码: import Lir .Formula var formula:String='{[[[(20+3)*5]]]-10-2.5}/ 2.5×(1134-500÷4)='; trace(Lir.Formula.replace(formula)); //调用类中的方法 就这上面这一点代码?对,就这一点代码!快运行程序,看下输出的结果: (((((20+3)*5)))-10-2.5)/2.5*(1134-500/4) 我们又见到了这个早已熟悉的标准算式了!哈哈哈……我们都可以开心地笑了…… 来自实践的体会绝对原创的经验 作者:张志晨 2012.5.6