在字符串中的数字之前添加字符串

时间:2018-10-04 05:43:11

标签: sql oracle

我正在寻找解决方案。

我有类似"AAAAAA 8 BBBBBB 5"的字符串 我必须用-代替数字前的空格,而用_-_代替其他空格。

有人可以帮我吗?

3 个答案:

答案 0 :(得分:3)

我将使用2个regexp_replace来做到这一点,像这样:

with the_string as (
    select 'AAAAAA 8 BBBBBB 5' s from dual
),
the_string_with_numbers_done as (
    select regexp_replace (s,' (\d)','-\1') s from the_string
)
select regexp_replace (s,' ','_-_') from the_string_with_numbers_done
;

以下是有关regexp_replace的信息:https://docs.oracle.com/database/121/SQLRF/functions163.htm#SQLRF06302

这是我喜欢用来处理正则表达式的网站:https://regexr.com/

编辑:根据OP的后续注释对版本进行了略微更改-更改了空白处理,因为OP在某些情况下似乎希望将连续的空白作为一个处理。但是,对于我来说,要求仍然不是100%明确,尤其是blank blank number应该变成:dash numberunderscore dash underscore dash number。以下版本采用前一种(dash number)。 HTH

with the_string as (
    select 'AAAAAA 8 BBBBBB 5' s from dual
),
the_string_with_numbers_done as (
    select regexp_replace (s,' +(\d)','-\1') s from the_string
)
select regexp_replace (s,' +','_-_') from the_string_with_numbers_done
;+

答案 1 :(得分:1)

您可以在此处使用REGEXP_REPLACE

示例:

select regexp_replace(
         regexp_replace('AAAAAA 8 BBBBBB 5', '\s([[:digit:]]+)', '-\1', 1, 0), 
                                               '([[:digit:]]+\s)', '\1_-_', 1, 0) as str
  from dual;

STR
--------------------
AAAAAA-8 _-_BBBBBB-5

此处有更多信息:https://docs.oracle.com/database/121/SQLRF/functions163.htm#SQLRF06302

答案 2 :(得分:0)

我还添加了

with the_string as (
    select TEST s from AA_TEST
),
**multiple_spaces as (
  select regexp_replace (s, '\s{2,}', ' ') s from the_string
),**
the_string_with_numbers_done as (
    select regexp_replace (s,' (\d)','_\1') s from multiple_spaces
)
select regexp_replace (s,' ','_-_') from the_string_with_numbers_done
;

现在,一切正常