Till today I believed that a non-word \W pattern means all not "alphanumeric chars + underscore" and this query confirmed my believes
select
level lvl
,chr(level) ch
,case when regexp_like(chr(level),'^['||chr(32)||'-'||chr(126)||']+$') then 'x' else ' ' end is_valid
,case when regexp_like(chr(level),'^[[:alnum:]]+$') then 'x' else ' ' end is_alnum
,case when regexp_like(chr(level),'^[[:print:]]+$') then 'x' else ' ' end is_print
,case when regexp_like(chr(level),'^[[:graph:]]+$') then 'x' else ' ' end is_graph
,case when regexp_like(chr(level),'^[[:alpha:]]+$') then 'x' else ' ' end is_alpha
,case when regexp_like(chr(level),'^[[:blank:]]+$') then 'x' else ' ' end is_blank
,case when regexp_like(chr(level),'^[[:cntrl:]]+$') then 'x' else ' ' end is_cntrl
,case when regexp_like(chr(level),'^[[:digit:]]+$') then 'x' else ' ' end is_digit
,case when regexp_like(chr(level),'^[[:lower:]]+$') then 'x' else ' ' end is_lower
,case when regexp_like(chr(level),'^[[:punct:]]+$') then 'x' else ' ' end is_punct
,case when regexp_like(chr(level),'^[[:space:]]+$') then 'x' else ' ' end is_space
,case when regexp_like(chr(level),'^[[:upper:]]+$') then 'x' else ' ' end is_upper
,case when regexp_like(chr(level),'^[[:xdigit:]]+$') then 'x' else ' ' end is_xdigit
,case when regexp_like(chr(level),'^\w+$') then 'x' else ' ' end is_word
,case when regexp_like(chr(level),'^\W+$') then 'x' else ' ' end is_nonword
,case when regexp_like(chr(level),'^\s+$') then 'x' else ' ' end is_whitespace
,case when regexp_like(chr(level),'^\S+$') then 'x' else ' ' end is_non_whitespace
from dual
connect by level <= 255
order by 1;
Well.. It looks like me and query were wrong.
I am trying to split a string by non-word chars
Can anybody, please, explain why two examples below gives me different results?
Thank you.
Example 1:
with tbl(msk,txt) AS
(select '[^\W]+','A,B C:D-E!F~G@H#I$J^K&L*M(N)O_P-Q+R=S{T}U[V]W|X\Y.Z`0' from dual)
select distinct level lvl,regexp_substr(txt,msk,1,level) one_word from tbl
connect by level <= regexp_count(txt, msk);
A,B C:D-E!F~G@H#I$J^K&L*M(N)O_P-Q+R=S{T}U[V]
|X
Y.Z`0
Example 2:
with tbl(msk,txt) AS
(select '[^[:punct:] ]+','A,B C:D-E!F~G@H#I$J^K&L*M(N)O_P-Q+R=S{T}U[V]W|X\Y.Z`0' from dual)
select distinct level lvl,regexp_substr(txt,msk,1,level) one_word from tbl
connect by level <= regexp_count(txt, msk);
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
0