有一表a 列divisionre的内容如下
公元1123––1125 
县境地处北纬3733’~37‘42,、东经114‘26,~114~43,之间,
被誉为&ldquo;元代第一庙&rdquo;与&ldquo;开沽(直沽、天津)妈祖&rdquo;,成为天津城市形成与发展的历史见证。<br />
这就是天津的发祥之地&mdash;&mdash;南开。<br />
现在我想截取html标记的那部分字符串,如下
&ndash; &nbsp;
&rsquo; &lsquo;
&ldquo; &rdquo; 
&mdash; 以&开始;结束的算一个字符串
每一行尽量不要重复匹配的 如&ndash;&ndash; 只记第一个就行
求方法,不用正则表达式能完成也ok

解决方案 »

  1.   

    请参考:SELECT regexp_substr(Divisionremar, '[^\&\;$]+', 1, LEVEL) AS 分隔符
    FROM a CONNECT BY LEVEL <= 子查询获得&出现的次数
      

  2.   

    实测数据:CREATE TABLE T107
    (
        ID VARCHAR2(20),
        Divisionre VARCHAR2(3000)
    );INSERT INTO T107 VALUES('01', '公元1123&ndash;&ndash;1125&nbsp;县境地处北纬3733&rsquo;~37&lsquo;42,、东经114&lsquo;26,~114~43,之间,被誉为&ldquo;元代第一庙&rdquo;与&ldquo;开沽(直沽、天津)妈祖&rdquo;,成为天津城市形成与发展的历史见证。<br />这就是天津的发祥之地&mdash;&mdash;南开。<br />');
    实测结果:
      

  3.   

    会不会出现变形的情况。
    比如一个&变形为&amp;amp;amp;
      

  4.   

    没中文环境。说下思路吧。
    类似楼上把&nbsp;形式的串以及回车提取出来。
    数据未两列,level,及截取的字符串。
    然后以这个表为虚拟表,分组进行distinct及拼接
      

  5.   

    写了下,超繁,还是写个function吧。
    create or replace function func_get_html_code(i_str varchar)
      return varchar2 as
      n_cnt        number;
      n_count      number;
      v_str_cut    varchar2(4000);
      v_str_mid    varchar2(4000);
      v_str_result varchar2(4000);
    begin
      select length(i_str) - length(replace(i_str, chr(10), '')) +
             length(i_str) - length(replace(i_str, '&', ''))
        into n_cnt
        from dual;
      n_count := 1;
      loop
        exit when n_count > n_cnt;
        select regexp_substr(i_str,
                             '(&[a-zA-Z]*;|' || chr(10) || ')',
                             1,
                             n_count)
          into v_str_cut
          from dual;
        if v_str_cut = chr(10) then
          v_str_mid    := v_str_mid || v_str_cut;
          v_str_result := v_str_result || v_str_mid;
          v_str_mid    := null;
        else
          select v_str_mid || case
                   when instr(nvl(v_str_mid, ' '), v_str_cut) = 0 then
                    v_str_cut
                 end
            into v_str_mid
            from dual;
        end if;
        n_count := n_count + 1;
      end loop;
      if v_str_cut != chr(10) then
        v_str_result := v_str_result || v_str_mid;
      end if;
      return v_str_result;
    end;