-------------------------------------------------------------------------------- -- setup for pattern matching examples -------------------------------------------------------------------------------- create table targets ( target varchar2(15) ); create procedure set_target( p_target varchar2 ) as begin delete from targets ; insert into targets values ( p_target ) ; end; / create procedure add_target( p_target varchar2 ) as begin insert into targets values ( p_target ); end; / create table patterns ( pattern varchar2(25), sort_key number ); create procedure set_pattern( p_pattern varchar2 ) as begin delete from patterns; insert into patterns values ( p_pattern, 1 ); end; / create procedure add_pattern( p_pattern varchar2 ) as begin insert into patterns values ( p_pattern , ( select count(*) + 1 from patterns ) ); end; / create view test_results as select pattern , target , case when regexp_like( target, pattern ) then 'Y' else 'N' end as match, regexp_substr( target, pattern ) as matched_value , regexp_instr( target, pattern ) as position from patterns, targets order by patterns.sort_key, target ; column pattern format a15 column target format a10 column match format a5 column matched_value format a15 column modifier format a8 column replaced_target format a15 column position format 999 column substring format a15 break on pattern skip 1 set null '(null)' set linesize 100 -------------------------------------------------------------------------------- -- setup for the section on POSIX character classes -------------------------------------------------------------------------------- create table character_class_map ( data varchar2(2) , symbol varchar2(3) , dec number , hex varchar2(4) , upper varchar2(1) , lower varchar2(1) , alpha varchar2(1) , digit varchar2(1) , xdigit varchar2(1) , alnum varchar2(1) , blank varchar2(1) , space varchar2(1) , cntrl varchar2(1) , punct varchar2(1) , graph varchar2(1) , print varchar2(1) ); declare v_data varchar2(2) ; v_hex_value varchar2(4) ; v_symbol varchar2(3) ; begin for i in 0 .. 255 loop v_hex_value := to_char( i, 'FM000X' ) ; v_data := unistr( '\' || v_hex_value ) ; v_symbol := case i when 0 then 'NUL' when 1 then 'SOH' when 2 then 'STX' when 3 then 'ETX' when 4 then 'EOT' when 5 then 'ENQ' when 6 then 'ACK' when 7 then 'BEL' when 8 then 'BS' when 9 then 'TAB' when 10 then 'LF' when 11 then 'VT' when 12 then 'FF' when 13 then 'CR' when 14 then 'SO' when 15 then 'SI' when 16 then 'DLE' when 17 then 'DC1' when 18 then 'DC2' when 19 then 'DC3' when 20 then 'DC4' when 21 then 'NAK' when 22 then 'SYN' when 23 then 'ETB' when 24 then 'CAN' when 25 then 'EM' when 26 then 'SUB' when 27 then 'ESC' when 28 then 'FS' when 29 then 'GS' when 30 then 'RS' when 31 then 'US' when 127 then 'DEL' when 128 then 'XXX' when 129 then 'XXX' when 130 then 'BPH' when 131 then 'NBH' when 132 then 'IND' when 133 then 'NEL' when 134 then 'SSA' when 135 then 'ESA' when 136 then 'HTS' when 137 then 'HTJ' when 138 then 'VTS' when 139 then 'PLD' when 140 then 'PLU' when 141 then 'RI' when 142 then 'SS2' when 143 then 'SS3' when 144 then 'DCS' when 145 then 'PU1' when 146 then 'PU2' when 147 then 'STS' when 148 then 'CCH' when 149 then 'MW' when 150 then 'SPA' when 151 then 'EPA' when 152 then 'SOS' when 153 then 'XXX' when 154 then 'SCI' when 155 then 'CSI' when 156 then 'ST' when 157 then 'OSC' when 158 then 'PM' when 159 then 'APC' when 173 then 'SHY' else v_data end ; insert into character_class_map ( data , symbol , dec , hex ) values ( v_data , v_symbol , i , v_hex_value ); end loop; end; / update character_class_map set upper = 'Y' where regexp_like( data, '[[:upper:]]' ); update character_class_map set lower = 'Y' where regexp_like( data, '[[:lower:]]' ); update character_class_map set alpha = 'Y' where regexp_like( data, '[[:alpha:]]' ); update character_class_map set digit = 'Y' where regexp_like( data, '[[:digit:]]' ); update character_class_map set xdigit= 'Y' where regexp_like( data, '[[:xdigit:]]'); update character_class_map set alnum = 'Y' where regexp_like( data, '[[:alnum:]]' ); update character_class_map set blank = 'Y' where regexp_like( data, '[[:blank:]]' ); update character_class_map set space = 'Y' where regexp_like( data, '[[:space:]]' ); update character_class_map set cntrl = 'Y' where regexp_like( data, '[[:cntrl:]]' ); update character_class_map set punct = 'Y' where regexp_like( data, '[[:punct:]]' ); update character_class_map set graph = 'Y' where regexp_like( data, '[[:graph:]]' ); update character_class_map set print = 'Y' where regexp_like( data, '[[:print:]]' ); commit; column symbol format a6 column dec format 999 column hex format a4 column upper format a5 column lower format a5 column alpha format a5 column digit format a5 column xdigit format a6 column alnum format a5 column blank format a5 column space format a5 column cntrl format a5 column punct format a5 column graph format a5 column print format a5