Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Question about regular expressions non-word pattern

garbuyaOct 3 2018 — edited Oct 3 2018

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

This post has been answered by mathguy on Oct 3 2018
Jump to Answer
Comments
Post Details
Added on Oct 3 2018
13 comments
753 views