解决方案 »

  1.   

    试试regexp_instr或regexp_replace
    http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions129.htm#SQLRF06300
    http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm#i1305521
      

  2.   

    --试试这个土方法
    SQL> select replace('[d2846209[p149092917[d3589076]][p149092918[d3589077]]]',
      2                 substr('[d2846209[p149092917[d3589076]][p149092918[d3589077]]]',
      3                        instr('[d2846209[p149092917[d3589076]][p149092918[d3589077]]]',
      4                              'p149092917') - 1,
      5                        22),
      6                 '')
      7    from dual;REPLACE('[D2846209[P149092917[D3
    --------------------------------
    [d2846209[p149092918[d3589077]]]
      

  3.   

    方法不错,唯一缺点就是不知道这个22怎么得到,可能字符长度不是22,能不能通过语句判断得到呢?
    寻找你指定字符后面的 ] 的位置
    select instr(substr('[d2846209[p149092917[d3589076]][p149092918[d3589077]]]',
                            instr('[d2846209[p149092917[d3589076]][p149092918[d3589077]]]',
                                  'p149092917') - 1),']')+1 from dual
    把这个拼到语句里就OK了,拼完貌似很长
      

  4.   

    方法不错,唯一缺点就是不知道这个22怎么得到,可能字符长度不是22,能不能通过语句判断得到呢?
    寻找你指定字符后面的 ] 的位置
    select instr(substr('[d2846209[p149092917[d3589076]][p149092918[d3589077]]]',
                            instr('[d2846209[p149092917[d3589076]][p149092918[d3589077]]]',
                                  'p149092917') - 1),']')+1 from dual
    把这个拼到语句里就OK了,拼完貌似很长
    不错,至少是实现了
      

  5.   

    这个不知道用哪个能实现?
    regexp_replace应该可以,写一个正则表达式就完事了,代码可以少很多
    就是正则表达式不好写
      

  6.   

    试一下
    select regexp_replace('[d2846209[p149092917[d3589076]][p149092918[d3589077]]]',
    '[[]p149092917[[][0-9a-zA-Z]+[]]','') str
    from dual
      

  7.   

    上面的结果比你要的结果多一个],修正下
    select regexp_replace('[d2846209[p149092917[d3589076]][p149092918[d3589077]]]',
    '[[]p149092917[[][0-9a-zA-Z]+[]]+','') str
    from dual
      

  8.   

    再补一个select regexp_replace('[d2846209[p149092917[d3589076]][p149092918[d3589077]]]','\[p149092917\[[[:alnum:]]{8}\]\]','') from dual;
      

  9.   

    效果非常好,但就是有一些小问题,比如这种:
    已知字段:[d2846914[p371728823[d4564258]][p371728819[d16405230]][p371728823[d4564258]][p371728823[d4564258]]]
    截取字段:p371728823
    结果:[d2846914[p371728819[d16405230]]]
    但是根据你sql的结果是[d2846914[p371728819[d16405230]],最后面少了一个‘]’
    但是根据你的sql,截出的结果是:
      

  10.   

    改为这样就可以了,
    select regexp_replace('[d2846209[p149092917[d3589076]][p149092918[d3589077]]]',
    '[[]p149092917[[][0-9a-zA-Z]+[]]{2}','') str
    from dual'{m,n}' 一个精确地出现次数范围,m=<出现次数<=n,'{m}'表示出现m次,'{m,}'表示至少出现m次。
      

  11.   

    oracle正则表达式