我的数据结构如下:
0-大分类编号-二分类编号-三分类编号:大分类名-二分类名-三分类名
例如: 
0-103-1508:时尚家电-电器附件
0-320-1414-1474:厨卫清洁-一次性用品-垃圾袋1
0-320-1414-1469-1471:厨卫清洁-一次性用品-保鲜膜1-保鲜袋1现在,我要取出二分类名(例如第一条取出:家电附件,第二条取出:一次性用品,第三条取出:一次性用品),用oracle正则该怎么写比较简洁?

解决方案 »

  1.   

    参考我的blog:Oracle 10g 正则表达式
    http://blog.csdn.net/tianlesoftware/archive/2009/11/12/4799552.aspx
    ------------------------------------------------------------------------------
    Blog: http://blog.csdn.net/tianlesoftware
    网上资源: http://tianlesoftware.download.csdn.net
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
    Q Q 群:62697716
      

  2.   

    with tt as(
      select '0-103-1508:时尚家电-电器附件' a from dual
      union all select '0-320-1414-1474:厨卫清洁-一次性用品-垃圾袋1' from dual
      union all select '0-320-1414-1469-1471:厨卫清洁-一次性用品-保鲜膜1-保鲜袋1' from dual
      )
    select ltrim(regexp_substr(a,'(-)(\w+)',instr(a,':')),'-') from tt或者
    select regexp_replace(substr(a,instr(a,'-',instr(a,':'),1)+1),'-[[:graph:]]*') from tt
      

  3.   

    select regexp_substr(regexp_replace(a,'.+:[^-]+-'),'[^-]+') from tt
    这样也行
    看看有没有更简单的写法
      

  4.   

    谢谢楼上的回答,问题解决了。能追问一下吗?我在网上查了,结果如下
    \w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'
    但是,现在明显能匹配中文,这是什么原因呢?
      

  5.   

    参照你的写法,我写了一个,如下:
    select regexp_replace(a, '(.*:)(\w+-)(\w+)(.*)', '\3') from tt;还请能帮我回答为什么能匹配中文的问题,谢谢!
      

  6.   

    厉害,比我写的好多了
    /w 的说明中没有明确提到是否能匹配中文的问题,但试验结果是可以匹配,如果觉得不保险,可以改成
    select regexp_replace(a, '(.*:)([^-]+-)([^-]+)(.*)', '\3') from tt;
      

  7.   

    谢谢wildwave的回答,结贴了。