使用正则表达式实现简易表达式计算器
由于我是做工程的,在实际使用中经常要对复杂公式进行计算,觉得使用 windows 计算器非常不方便,也容易出错,而 matlab 用于小型的计算太浪费(主要是启动比较慢,而且不是所有地方都有),因此决定自己写一个表达式计算器进行使用。在写计算器的过程中,研究了 .NET 的正则表达式系统,略有心得。将其写出来与大家分享。
注:实际完成的表达式计算器可在我的 115 共享上下载,基于了 .NET2.0 版。同时也提供了一个 .NET 2.0 Compact Framework 的版本,可以用于 Windows Mobile 手机,实测在 Windows Mobile 6.1 和 Windows Mobile 6.5 上运行正常。
在工程应用中,用到最多的就是整数的位运算,与或非异或移位等操作非常频繁,且经常会有连续操作。特别是在通信控制中,经常使用的校验(采用累加或异或的方式),要计算也较多,因此首先考虑了整数的表达式计算,后续考虑了双精度数据的计算。
1. .NET Framework 正则表达式概述( 本节内容来自 Microsoft MSDN )
正则表达式提供了功能强大、灵活而又高效的方法来处理文本。正则表达式的全面模式匹配表示法使您可以快速分析大量文本以找到特定的字符模式;验证文本以确保它匹配预定义的模式(如电子邮件地址);提取、编辑、替换或删除文本子字符串;将提取的字符串添加到集合以生成报告。对于处理字符串或分析大文本块的许多应用程序而言,正则表达式是不可缺少的工具。
正则表达式的工作方式
使用正则表达式处理文本的中心构件是正则表达式引擎,该引擎在 .NET Framework 中由 System.Text.RegularExpressions. Regex 对象表示。 使用正则表达式处理文本至少要求向该正则表达式引擎提供以下两方面的信息:
- 要在文本中标识的正则表达式模式。
在 .NET Framework 中,正则表达式模式用特殊的语法或语言定义,该语法或语言与 Perl 5 正则表达式兼容,并添加了一些其他功能,例如从右到左匹配。有关更多信息,请参见 正则表达式语言元素 。
- 要为正则表达式模式分析的文本。
Regex 类的方法使您可以执行以下操作:
- 通过调用 IsMatch 方法确定输入文本中是否具有正则表达式模式匹配项。 有关使用 IsMatch 方法验证文本的示例,请参见 如何:验证字符串是否为有效的电子邮件格式 。
- 通过调用 Match 或 Matches 方法检索匹配正则表达式模式的一个或所有文本匹配项。 第一个方法返回提供有关匹配文本的信息的 Match 对象。 第二个方法返回 MatchCollection 对象,该对象对于在分析的文本中找到的每个匹配项包含一个 Match 对象。
- 通过调用 Replace 方法替换匹配正则表达式模式的文本。 有关使用 Replace 方法更改日期格式和移除字符串中的无效字符的示例,请参见 如何:从字符串中剥离无效字符 和 示例:更改日期格式 。
*** 详细的 .NET 正则表达式使用请参见 Microsoft MSDN
2. 整数表达式运算的实现
2.1 需求分析
首先要确定整数表达式运算需要实现哪一些功能。根据实际情况,当前确定整数表达式运算至少应该支持如下功能:
Ø 可进行四则运算(加法 + ;减法 - ;乘法 * ;除法 / );
Ø 可进行求模(余)操作( % );
Ø 可进行位运算(取反 ~ ;与 & ;或 | ;异或 ^ );
Ø 可进行移位操作(左移 << ;右移 >> );
Ø 可进行部分函数运算(符号 sign ;绝对值 abs ;最大值 max ;最小值 min ;幂