首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从字符串中获取数字

如何从字符串中获取数字
EN

Stack Overflow用户
提问于 2013-12-30 11:32:21
回答 3查看 169关注 0票数 2

我在用甲骨文,

在一篇专栏文章中,我得到的数据如下:

代码语言:javascript
复制
my_name 1234

my_name1 1234

my name (1234)

my name : 1234

这些是名称,而ID (数字)名称也可以包含数字,但ID总是4-6位数字。

我只对身份证感兴趣。我对JS和Perl中的regex有很好的理解,但在Oracle SQL中我对此一无所知。

我试过这样做:regexp_replace('my_name - 7203', '[^[:digit:]]')运行良好,但在名称包含数字的情况下失败。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-30 12:35:55

试试这个:

代码语言:javascript
复制
select regexp_replace('my_4name - 7203', '.*?([[:digit:]]+)[)]?$','\1')  from dual;

希望这个能帮到你。

票数 2
EN

Stack Overflow用户

发布于 2013-12-30 12:41:54

这不是一个很好的解决方案,它应该能像你想的那样工作。此外,我在子查询中分解它,以便更易于理解。

最后的替换将是:

代码语言:javascript
复制
substr( trim(regexp_replace(name, '[^[:digit:]]', ' ')), 
    regexp_instr( trim(
                        regexp_replace(name, 
                                       '[^[:digit:]]', ' ')), '[^[:digit:]]')+1, 
           length(trim(regexp_replace(name, '[^[:digit:]]', ' ')))) as ID

在这里检查一下:

代码语言:javascript
复制
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)

这是一个需要理解的版本:

代码语言:javascript
复制
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)。

票数 0
EN

Stack Overflow用户

发布于 2013-12-30 13:46:14

这个正则表达式:[ \W ]+ ( \d\d\d\d [\d]? [\d]? )似乎起作用了。

这里的模式基于ID将是4-6位长- \d\d\d\d [\d]? [\d]?的数据。

...in情况下,要接受的ID超过六位数,您可以用[\d]*代替[\d]?[\d]?。另外,假设是ID将以一个非字母字符作为前缀。

例子: :space(等。

\W将负责区分"name“和"ID”后面的任意数字。

测试运行:

代码语言:javascript
复制
input-  my name123456789:12345 
output-  12345 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20838676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档