如何从字符串中获取数字

时间:2013-12-30 11:32:22

标签: sql regex oracle

我正在使用Oracle,

在一个专栏中我得到的数据如下:

my_name 1234

my_name1 1234

my name (1234)

my name : 1234

这些是名称和ID(数字) 名称也可以包含数字,但ID始终是4-6位数

我只对ID感兴趣。 我对JS和Perl中的正则表达式有很好的理解,但我在Oracle SQL中不知道它

我试过这个:regexp_replace('my_name - 7203', '[^[:digit:]]') 哪个工作正常但在名称包含数字的情况下失败..

3 个答案:

答案 0 :(得分:2)

试试这个:

select regexp_replace('my_4name - 7203', '.*?([[:digit:]]+)[)]?$','\1')  from dual;

愿这对你有所帮助。

答案 1 :(得分:0)

这不是一个漂亮的解决方案,它应该按你的意愿工作。此外,我在子查询上将其分解为更难以理解。

最后的替换将是:

substr( trim(regexp_replace(name, '[^[:digit:]]', ' ')), 
    regexp_instr( trim(
                        regexp_replace(name, 
                                       '[^[:digit:]]', ' ')), '[^[:digit:]]')+1, 
           length(trim(regexp_replace(name, '[^[:digit:]]', ' ')))) as ID

在此处查看:

select substr( trim(regexp_replace(name, '[^[:digit:]]', ' ')), 
               regexp_instr(trim(
                regexp_replace( name, 
                    '[^[:digit:]]', 
        ' ')), '[^[:digit:]]')+1, 
               length(trim(regexp_replace(name, '[^[:digit:]]', ' ')))) as ID 
          from ( select 'my_name 1234' name from dual union all
                 select 'my_name1 1234' name from dual union all
                 select 'my name (1234)' name from dual union all
                 select 'my_name1:1234' name from dual union all
                 select 'my name : 1234' name from dual)

这是要修改的版本:

select substr( justNumbers, 
               regexp_instr(justNumbers, '[^[:digit:]]')+1, 
               length(justNumbers)) as ID 
  from (select trim(regexp_replace(name, '[^[:digit:]]', ' ')) as justNumbers
          from ( select 'my_name 1234' name from dual union all
                 select 'my_name1 1234' name from dual union all
                 select 'my name (1234)' name from dual union all
                 select 'my_name1:1234' name from dual union all
                 select 'my name : 1234' name from dual)
               )

我们的想法是只留下数字,然后从下一个不是数字的字符+1中获取数字(regexp_instr(justNumbers, '[^[:digit:]]')+1)。

答案 2 :(得分:0)

这个正则表达式:[ \W ]+ ( \d\d\d\d [\d]? [\d]? )似乎有效。

此处的模式基于ID为4-6位长的数据 - \d\d\d\d [\d]? [\d]?

...如果要接受的ID超过六位数,您可以将[\d]?[\d]?替换为[\d]*。此外,假设是ID将以非字母字符作为前缀

示例: :space(等...

\W会在“名称”和“ID”之后区分任意数量的数字。

测试运行:

input-  my name123456789:12345 
output-  12345