动态计算字串表达式值的类

最近用到了这个功能,要计算一些字符串表达式,如"1 + 3 / 2"等等,就写了这个类。原理很简单,就是用CodeDom动态生成一个包含自定义函数的程序集,再通过反射调用。网上例子极多。我这个类是拿来就可以用的,只需要Copy一下代码就可以直接用,不用读代码。支持常用数学函数,如Sin,Log等,而且不区分大小写。

------------------------------------------------------------------------------------
其实大家可以使用ADO.NET中的DataTable来实现,加入一个DataColumn然后把Expression属性赋值成这个表达式,之后一个筛选返回数据就可以了,简单方便,也比这个快多了
--------------------------------------------------------------------------------------
我用sql实现过这个功能

select   top   1  ( 1 + 3 / 2 as  ret  from  table_name  where   1 = 1  


当时找不到别的办法了,自己写逆根遍历太麻烦了,就想了这个歪点子


歪点子可以更简单点,嘿嘿

select (1+3/2) as Exp1
----------------------------------------------------------------------------------------
还有更好的方法

Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine(); 
object  qswhEval3( string  Expression)
return Microsoft.JScript.Eval.JScriptEvaluate(Expression,ve); 
}
 

 

只需要添加Microsoft.JScript和Microsoft.Vsa两个引用就OK,超简洁....呵呵

------------------------------------------------------------------------------------------
这样做不错,但是搂住没有考虑到一个问题,每做一次计算,就会编译出来一个Assembly,并装载在当前的AppDomain,这样随着程序的不断计算,越来越多地Assembly被装载在当前AppDomain,一个Assembly一旦被装载,除非所在的AppDomain被卸载,否则。net是不能单独卸载某个Assembly,这样使用的内存会越来越多,又不能被垃圾回收
-----------------------------------------------------------------------------------------
最简单的方法:

string  exp  =   " (5+6)*8-3/2-4+3 "
DataTable myDataTable 
=   new  DataTable( " CalcTable " ); 
exp 
=  Convert.ToString(myDataTable.Compute(exp, "" )); 


-----------------------------------------------------------------------------------------
 
 

### JavaScript 中替换字符串的方法 在 JavaScript 中,`replace()` 方法是最常用的字符串替换工具之一。该方法可以用来替换指定的子字符串或者通过正则表达式匹配的部分[^3]。 以下是 `replace()` 的基本语法以及一些常见的使用场景: #### 基本语法 ```javascript str.replace(regexp|substr, newSubStr|function); ``` - **regexp | substr**: 要查找并替换掉的内容,可以是一个具体的子字符串或者是正则表达式。 - **newSubStr | function**: 用于替代找到部分的新子字符串,也可以是一个返回新子字符串的回调函数。 #### 示例代码 ##### 示例 1:简单替换特定子字符串 如果需要将字符串中的某个单词替换为另一个单词,则可以直接传入目标字串作为参数: ```javascript let originalString = "Hello, world!"; let replacedString = originalString.replace("world", "JavaScript"); console.log(replacedString); // 输出: Hello, JavaScript! ``` 此操作仅会替换第一次出现的目标子字符串。 ##### 示例 2:利用正则表达式全局替换所有匹配项 当希望一次性替换整个字符串里所有的相同模式时,可借助带有标志 g (global) 的正则表达式完成多处修改: ```javascript const text = 'The rain in SPAIN stays mainly in the plain.'; const newText = text.replace(/ain/g, 'ane'); console.log(newText); // The rane in SPANE stays manely in the plane. ``` 这里 `/ain/g` 表达了一个寻找所有 “ain” 实例的要求,并将其改为 “ane”。注意大小写敏感性;若需忽略大小写的区别,可以在正则后面加上 i 参数形成 /pattern/i 形式的组合。 ##### 示例 3:动态计算替换——使用回调函数形式 除了静态文字外,还可以定义更复杂的逻辑来决定最终显示的结果。这可以通过提供第三个参数作为一个处理数据的功能实现灵活控制输出效果: ```javascript function replacer(match, p1, offset, string){ return '[' + match.toUpperCase() + ']'; } var s = 'a bc def ghij klmno pqrst uvw xyz'; s = s.replace(/\b\w+\b/g, replacer); console.log(s); // [A] [BC] [DEF] [GHIJ] [KLMNO] [PQRST] [UVW] [XYZ] ``` 上述例子展示了如何把每一段独立词组转换成大写字母包围的形式。 #### 特殊情况 - 替换最后一个字符 对于专门针对最后一位置进行调整的需求,我们可以先获取到原长度再减去相应数量得到起始索引点数之后截取剩余片段拼接新的结尾构成完整结果集: ```javascript let str = "abcdef"; if(str.length >0 ){ let lastCharIndex=str.length-1; let modifiedStr= str.substring(0,lastCharIndex)+'X';//假设我们要换成 X 这个字母 } console.log(modifiedStr );//"abcdeX" ``` 这种方法手动定位到了倒数第一位的位置进行了单独处置[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值