假设我有一个字符串 -
function twice(number){
return number * 2;
}
我希望能够做到
"a b cc d d e"
让它返回“d d”。
我使用“[^] +”作为我的模式,但它分割了我不想要的单个空格。
答案 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