如何替换字符串中的值,但oracle中最后一次出现特定值除外

时间:2018-07-04 06:38:58

标签: sql regex oracle replace

假设我具有此列值:

new operational goods123 type 1 for main goods type 9

我想在最后一次出现 type 单词后用替换并使用正则表达式获取数字值。 在这种情况下,我想找到 9 。 我认为正则表达式可能是这样的:

select REGEXP_REPLACE((SELECT REGEXP_REPLACE(' new operational goods123 type 1 for main goods type 2 ',
                                            '[^(type)[:digit:]]',
                                            ' ')
                        FROM dual),
                      '[^[:digit:]]')
  from dual;

但此查询返回 12319

2 个答案:

答案 0 :(得分:2)

您可以使用

select REGEXP_REPLACE('new operational goods123 type 1 for main goods type 9',
                      '.*type\s*([0-9]+).*',
                      '\1',
                      1,
                      1,
                      'n'
                     ) as Result from dual

enter image description here

请参见online demo

模式匹配

  • .*-尽可能多的0个字符(包括使用n修饰符的换行符)
  • type-字符串type的最后一次出现(由于前面的贪婪模式)
  • \s*-0 +空格字符
  • ([0-9]+)-捕获到组1中的1个或更多数字
  • .*-字符串的其余部分。

替换项包含一个\1占位符,引用了组1中的值。

第一个1是搜索引擎的起始位置,第二个1是“替换操作的发生”(我们只需替换一次)。

答案 1 :(得分:1)

尝试一下

select substr('new operational goods123 type 1 for main goods type 9', instr('new operational goods123 type 1 for main goods type 9', 'type', -1)+ 5) from dual

注意:我假设“类型”后有一个空格