论坛首页 Java企业应用论坛

是正则表达式还是ANTLR的用武之地?

浏览 4536 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-04-19  
有这么一个字符串:a1=1,a2=X2{b1=1,b2=X3{c1=1,c2=2}},a3=X4{b1=1}
想写一个正则表达式,让下面code的执行结果是:
result(以逗号为token来分割字符串,逗号在"{"和"}"里面的忽略其做为token):
a1=1
a2=X2{b1=1,b2=X3{c1=1,c2=2}}
a3=X4{b1=1}


code:
Pattern p1 = Pattern.compile("(?<=^|,)(?:[^,{]++(?:\\{[^{}]*+(?:\\{[^{}]++\\})*+\\})*+)*+(?=,|$)");
Matcher m1 = p1.matcher("a1=1,a2=X2{b1=1,b2=X3{c1=1,c2=2}},a3=X4{b1=1}");
  while( m1.find() )
  {
      String foundstring = m1.group();
      System.out.println("foundstring:" + foundstring);
  }

用正则表达式实现上面需求确实比较无奈,还是要动用到ANTLR定义自己的语言规则比较好?
   发表时间:2007-04-20  
郁闷,原来Java不支持正则表达式的无限递归匹配。
0 请登录后投票
   发表时间:2007-04-20  
个人感觉用antlr比较好,但是项目中很少用到,没仔细看过
0 请登录后投票
   发表时间:2007-04-20  
Pattern p1 = Pattern.compile("(?<=^|,)(?:[^,{]++(?:\\{[^{}]*+(?:\\{[^{}]++\\})*+\\})*+)*+(?=,|$)");


  上面的表达式满足我的结果,也就是只支持{}的一层嵌套,如果想满足二层嵌套,就必须写两倍长度于上面的正则表达式。正则表达式处理这种递归确实是个弱项。

0 请登录后投票
   发表时间:2007-04-20  
如果格式是逗号和{}这些固定的, 自己写个解析程序很简单的, 效率又不知高多少倍.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics