RT,最近又看了下JAVA的正则式,解决了之前对JAVA中正则式的一些疑问.
写了个利用正则式计算表达式值的代码.算法很简单,就是"先乘除,后加减,有括号先算括号里的"
ps:当然,计算表达式值最常用也最有效的方法是利用逆波兰式,这儿只是拿正则式来练练手.
程序没有经过严谨的测试,可能有bug.
java 代码
- import
java.util.regex.*;
- import
java.util.*;
-
-
-
-
-
- public
class
Calculate{
- /*
- 正则式这块贴上来会影响代码结构,略之.
- 详见打包后的代码
- */
-
private
static
double
operator(Matcher m,
int
index){
- index =index*
2
;
-
double
a,b;
-
if
(m.group(
1
)!=
null
){
- a =Double.parseDouble(m.group(
1
));
- b =Double.parseDouble(m.group(
2
));
- }
-
else
{
- index ++;
- a =Double.parseDouble(m.group(
3
));
- b =Double.parseDouble(m.group(
4
));
- }
-
double
r =
0.0
;
-
switch
(index){
-
case
0
:
- r =a+b;
-
break
;
-
case
1
:
- r =a-b;
-
break
;
-
case
2
:
- r =a*b;
-
break
;
-
case
3
:
- r =a/b;
-
break
;
- }
-
return
r;
- }
-
public
static
double
eval(String str){
- StringBuilder sb =
new
StringBuilder(str.replaceAll(
"\\s+"
,
""
));
-
while
(
true
){
- Matcher m =BRA.matcher(sb);
-
if
(m.find()){
- sb.replace(m.start(),m.end(),m.group(
1
));
- }
-
else
{
-
int
index =
1
;
- m =MUL_OR_DIV.matcher(sb);
-
if
(!m.find()){
- index --;
- m =ADD_OR_SUB.matcher(sb);
-
if
(!m.find())
break
;
- }
- sb.replace(m.start(),m.end(),
""
+operator(m,index));
- }
- }
-
return
Double.parseDouble(sb.toString());
- }
-
public
static
void
main(String[] args){
- Scanner scan =
new
Scanner(System.in);
-
while
(
true
){
- System.out.print(
"\nEnter a expression :"
);
- String str =scan.next();
-
if
(str.equals(
"exit"
))
break
;
- System.out.print(str +
" = "
+eval(str));
- }
- }
- }
分享到:
相关推荐
RegexApplication/Default.aspx 正则表达式类的应用 RegexApplication/GetPageHtmlData.aspx 获取网页的内容 第10章(/10/) ASPNETValidator/Compare.aspx 比较验证 ASPNETValidator/...
正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 -或- 对正则表达式功能字符的还原,如"*"匹配它...
实例076 使用正则表达式验证一年的12个月份 92 实例077 使用正则表达式验证一个月的31天 93 实例078 使用正则表达式验证数字输入 94 实例079 使用正则表达式验证密码长度 95 实例080 使用正则表达式验证非零的正整数...
第10章 正则表达式的模式匹配 10.1 正则表达式的定义 10.2 用于模式匹配的String方法 10.3 RegExp对象 第11章 JavaScript的子集和扩展 11.1 JavaScript的子集 11.2 常量和局部变量 11.3 解构赋值 11.4 迭代 11.5 ...
第10章 正则表达式的模式匹配 10.1 正则表达式的定义 10.2 用于模式匹配的String方法 10.3 RegExp对象 第11章 JavaScript的子集和扩展 11.1 JavaScript的子集 11.2 常量和局部变量 11.3 解构赋值 11.4 迭代 11.5 ...
第10章 正则表达式的模式匹配 10.1 正则表达式的定义 10.2 用于模式匹配的String方法 10.3 RegExp对象 第11章 JavaScript的子集和扩展 11.1 JavaScript的子集 11.2 常量和局部变量 11.3 解构赋值 11.4 迭代 11.5 ...
第10章 正则表达式的模式匹配 253 10.1 正则表达式的定义 253 10.2 用于模式匹配的string方法 261 10.3 regexp对象 263 第11章 javascript的子集和扩展 267 11.1 javascript的子集 268 11.2 常量和局部变量 271 11.3...
121 <br>0200 如何使用正则表达式验证电话号码 121 <br>0201 如何使用正则表达式验证输入密码条件 121 <br>0202 如何使用正则表达式验证邮政编号 121 <br>0203 如何使用正则表达式验证手机号 ...
第10章 正则表达式的模式匹配 253 10.1 正则表达式的定义 253 10.2 用于模式匹配的string方法 261 10.3 regexp对象 263 第11章 javascript的子集和扩展 267 11.1 javascript的子集 268 11.2 常量和局部变量 271 11.3...
第10章 正则表达式的模式匹配 253 10.1 正则表达式的定义 253 10.2 用于模式匹配的string方法 261 10.3 regexp对象 263 第11章 javascript的子集和扩展 267 11.1 javascript的子集 268 11.2 常量和局部变量 271 11.3...
7.4.3 整数值测试运算符 188 7.4.4 逻辑运算符 189 7.5 命令行的解释执行过程 190 7.5.1 读取命令行 191 7.5.2 命令历史替换 191 7.5.3 别名替换 192 7.5.4 花括号扩展 192 7.5.5 波浪号替换 192 7.5.6 I/O重定向 ...