Oracle Regexp - 由多个空格而不是单个空格

时间:2016-11-10 20:47:26

标签: sql regex oracle plsql

假设我有一个字符串 -

function twice(number){
  return number * 2;
}

我希望能够做到

"a   b      cc  d d  e"

让它返回“d d”。

我使用“[^] +”作为我的模式,但它分割了我不想要的单个空格。

3 个答案:

答案 0 :(得分:1)

我认为这会做你想做的事情:

select regexp_substr(col, '([^ ]*[ ]?[^ ]+)+', 1, 4)

答案 1 :(得分:0)

假设您正在寻找第四次出现的一个或多个连续空格,并且您想要返回该PLUS周围的非空格字符(并允许在字符串的开头或结尾处有一个或多个空格,在哪种情况下,结果将不会在该方面具有非空格字符):

with
     inputs ( str, occ ) as (
       select 'a   b      cc  d d  e', 4 from dual
     )
select regexp_substr(str, '([^ ]+|^)[ ]+', 1, occ) || 
          regexp_substr(str,'[ ]+([^ ]+|$)', 1, occ, null, 1) as token
from inputs
;

具体来说,这将为occ的值1,2,3,4,5产生以下输出:

'a b''b cc''cc d''d d''d e'

请注意,只要找到一个匹配项,就会在找到匹配项后的字符处开始搜索下一个匹配项。在我对该问题的解释中,非空格字符包含在重叠的候选匹配中,因此在regexp_substr的单个传递中不可能(我不认为)这样做。

我在顶部的CTE中输入字符串和事件(4);这是设置测试数据的一部分,而不是解决方案的一部分。

答案 2 :(得分:0)

这个会做的伎俩:

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