*********表达式替换问题********

shanxmxj 2010-12-07 01:00:07
表中的一个字段内容是这样的:
( {id:[1001],一次性初装费收入} + {id:[1002],固网语音收入} ) ÷ {id:[1003],装机收入}

这是一个指标的计算公式 是由多个指标通过四则运算得到 存到数据库中
中括号里是id,后面跟着的是指标名称;大括号中的内容为一个指标信息 ;
现在要对这些指标进行四则运算

问题:
1. 如何获取到每个指标的id?获取到id以后就可以取到指标值

2.如何将获取到的指标值替换把这个公式中的指标内容替换掉

比如说:
替换以后的公式:(100+110)÷120 现在想要实现这种效果

请大家给个思路!有代码的话或贴些代码更好!谢谢大家!
...全文
178 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
shanxmxj 2010-12-08
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 tubage408 的回复:]
唉.............
String abc = "(100+200)/0+200";
Pattern pp = Pattern.compile("(/0)");
Matcher mm = pp.matcher(abc);
StringBuffer tt = new StringBuffer();
while(mm.find()){
mm.appendReplacement(tt……
[/Quote]

额 这样啊 全部替换完以后再去用这个规格去匹配下 然后再替换。
晓得了!!非常感谢!
tubage408 2010-12-08
  • 打赏
  • 举报
回复
唉.............
String abc = "(100+200)/0+200";
Pattern pp = Pattern.compile("(/0)");
Matcher mm = pp.matcher(abc);
StringBuffer tt = new StringBuffer();
while(mm.find()){
mm.appendReplacement(tt, "/1");
}
mm.appendTail(tt);
System.out.println(tt.toString());
shanxmxj 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 tubage408 的回复:]
你是说根据指标去取值,取出来的是null之类的是吧?也就是指标没有对应的值。要是这样的话,要看你们的业务需要了(这个客户应该有业务规则),这个我就不好给了。
[/Quote]

我的意思 是如果值为空的时候 给默认值为0的话 有除法运算的话 会报错

应该怎么样去判断一下 是不是有除法运算 然后再给相应的默认值。
tubage408 2010-12-07
  • 打赏
  • 举报
回复
你是说根据指标去取值,取出来的是null之类的是吧?也就是指标没有对应的值。要是这样的话,要看你们的业务需要了(这个客户应该有业务规则),这个我就不好给了。
shanxmxj 2010-12-07
  • 打赏
  • 举报
回复
现在取值和替换值都没有问题了

但是有新的问题了

如果 指标值为空的时候 应该怎么去判断 给个什么默认值比较好呢?
tubage408 2010-12-07
  • 打赏
  • 举报
回复
不好意思,回错了,是另一个的问题
shanxmxj 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tubage408 的回复:]
没有.cn??
[/Quote]

什么意思 不太明白
没有这个的
shanxmxj 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tubage408 的回复:]
AU1100还有这样的呀,那你直接把\d改成\w
[/Quote]
是的 这是指标的编号 里面是带有字母的
shanxmxj 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tubage408 的回复:]
不知道我提方法可以不,只要是思路.........
[/Quote]

呵呵 ~~ 谢谢回复 有个思路就很感谢了
tubage408 2010-12-07
  • 打赏
  • 举报
回复
没有.cn??
tubage408 2010-12-07
  • 打赏
  • 举报
回复
不知道我提方法可以不,只要是思路.........
tubage408 2010-12-07
  • 打赏
  • 举报
回复
AU1100还有这样的呀,那你直接把\d改成\w
shanxmxj 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tubage408 的回复:]
String gs = "( {id:[1001],一次性初装费收入} + {id:[1002],固网语音收入} ) ÷ {id:[1003],装机收入}";
Pattern p = Pattern.compile("id:(\\[\\d+\\])");
Matcher m = p.matcher(gs);
while(m.find()){
String id = m.group(1);
……
[/Quote]
感谢回复

这个方法是先取id 然后替换{}的内容为值 是么
这个正则表达式对简单点的可以 但是稍复杂些的就不行了

比如说这个
{id:[AU1000],固定电话用户(在网)} + {id:[AU1100],  普通电话用户(在网)} - {id:[AU1110],    城市普通电话用户(在网)} × {id:[AU1130],    农村普通电话用户(在网)}
tubage408 2010-12-07
  • 打赏
  • 举报
回复
String gs = "( {id:[1001],一次性初装费收入} + {id:[1002],固网语音收入} ) ÷ {id:[1003],装机收入}";
Pattern p = Pattern.compile("id:(\\[\\d+\\])");
Matcher m = p.matcher(gs);
while(m.find()){
String id = m.group(1);
id = id.replaceAll("\\[|\\]","");
System.out.println(id);
}
这样你可以提取出指标值,然后你按照顺序把表达式中的{}只换掉,置换后也就是形如:(100+110)÷120 这样的字符串,然后你写个sql,如select (100+110)÷120 as result from dual,这样就能得到你的结果了。不知道这样可以不。
shanxmxj 2010-12-07
  • 打赏
  • 举报
回复
就是说 四则运算的 方法不是固定的

但是 指标的内容显示都是固定的 {id:[编号],名称}

shanxmxj 2010-12-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 viszl 的回复:]
Java code


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class test2 {
public static void main(String[] args){
String str ="( {id:[1001],一次性初装费收入} + {id:……
[/Quote]
谢谢回复

这个正则表达式 可以匹配所有的公式么? 我忘记说了 公式的格式不是固定的
loveofmylife 2010-12-07
  • 打赏
  • 举报
回复


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class test2 {
public static void main(String[] args){
String str ="( {id:[1001],一次性初装费收入} + {id:[1002],固网语音收入} ) ÷ {id:[1003],装机收入}";
String regex = "(\\{id:\\[(\\d*)\\][^}]*\\})";
Matcher m = Pattern.compile(regex).matcher(str);
while(m.find()){
str = str.replace(m.group(1), t(m.group(2)));
}
System.out.println(str);
}

public static String t(String s){
return s;//在这可以根据得到的id找到正确的指标值
}
}

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧