这个可以解决问题:
select regexp_substr(str, '([^ ]([ ]?[^ ])*)',1, 4)
如果你想解析出所有谨慎的值,你可以使用这个:
with sample_data as (
select 'a b cc d d e' str from dual union all
select ' a b cc d dd d e' str from dual
)
, recurse(str, seq, nxt, tok) as (
select str
, 1
, regexp_instr (str, '[ ]{2,}',1,1,1)
, regexp_substr(str, '([^ ]([ ]?[^ ])*)',1, 1)
from sample_data
union all
select str
, seq+1
, regexp_instr(str, '[ ]{2,}',nxt,1,1)
, regexp_substr(str, '([^ ]([ ]?[^ ])*)',nxt, 1)
from recurse
where nxt > 0
)
select * from recurse order by str, seq;
STR SEQ NXT TOK
------------------------- ---------- ---------- -------------------------
a b cc d dd d e 1 6 a
a b cc d dd d e 2 13 b
a b cc d dd d e 3 17 cc
a b cc d dd d e 4 25 d dd d
a b cc d dd d e 5 0 e
a b cc d d e 1 5 a
a b cc d d e 2 12 b
a b cc d d e 3 16 cc
a b cc d d e 4 21 d d
a b cc d d e 5 0 e
10 rows selected