我在用甲骨文,
在一篇专栏文章中,我得到的数据如下:
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:]]')运行良好,但在名称包含数字的情况下失败。
发布于 2013-12-30 12:35:55
试试这个:
select regexp_replace('my_4name - 7203', '.*?([[:digit:]]+)[)]?$','\1') from dual;希望这个能帮到你。
发布于 2013-12-30 12:41:54
这不是一个很好的解决方案,它应该能像你想的那样工作。此外,我在子查询中分解它,以便更易于理解。
最后的替换将是:
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)。
发布于 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”后面的任意数字。
测试运行:
input- my name123456789:12345
output- 12345 https://stackoverflow.com/questions/20838676
复制相似问题