有一表a 列divisionre的内容如下
公元1123––1125
县境地处北纬3733’~37‘42,、东经114‘26,~114~43,之间,
被誉为“元代第一庙”与“开沽(直沽、天津)妈祖”,成为天津城市形成与发展的历史见证。<br />
这就是天津的发祥之地——南开。<br />
现在我想截取html标记的那部分字符串,如下
–
’ ‘
“ ”
— 以&开始;结束的算一个字符串
每一行尽量不要重复匹配的 如–– 只记第一个就行
求方法,不用正则表达式能完成也ok
公元1123––1125
县境地处北纬3733’~37‘42,、东经114‘26,~114~43,之间,
被誉为“元代第一庙”与“开沽(直沽、天津)妈祖”,成为天津城市形成与发展的历史见证。<br />
这就是天津的发祥之地——南开。<br />
现在我想截取html标记的那部分字符串,如下
–
’ ‘
“ ”
— 以&开始;结束的算一个字符串
每一行尽量不要重复匹配的 如–– 只记第一个就行
求方法,不用正则表达式能完成也ok
FROM a CONNECT BY LEVEL <= 子查询获得&出现的次数
(
ID VARCHAR2(20),
Divisionre VARCHAR2(3000)
);INSERT INTO T107 VALUES('01', '公元1123––1125 县境地处北纬3733’~37‘42,、东经114‘26,~114~43,之间,被誉为“元代第一庙”与“开沽(直沽、天津)妈祖”,成为天津城市形成与发展的历史见证。<br />这就是天津的发祥之地——南开。<br />');
实测结果:
比如一个&变形为&amp;amp;
类似楼上把 形式的串以及回车提取出来。
数据未两列,level,及截取的字符串。
然后以这个表为虚拟表,分组进行distinct及拼接
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;