日期:2014-05-17  浏览次数:21014 次

求一个正则表达式,寻找大牛
本帖最后由 guoxiangdaxia 于 2013-09-13 14:29:14 编辑
要写一个校验银行账号的正则表达式,要过滤顺序数字,如果账号是1位全部过滤,如果账号是两位,则过滤连续的两位数字,01,12,23,等,如果账号是3位,就过滤 123,234,567 等连续的3位数字,只校验10位和10位以内的账号,10位以上的不做校验。意思是0123456789 就过滤  10123456789就通过。
请问大神怎么写啊,本屌看了一天了写不下来。跪求啊~~

------解决方案--------------------
看到题目第一个想法 但是效率很一般  肯定还有其他方法的..


with t1 as
(
     select 1 tid,'23' tno from dual union all
     select 2 tid,'35' tno from dual union all
     select 3 tid,'567' tno from dual union all
     select 4 tid,'745' tno from dual union all
     select 5 tid,'6' tno from dual union all
     select 6 tid,'555' tno from dual union all
     select 7 tid,'7891' tno from dual union all
     select 8 tid,'12345' tno from dual union all
     select 9 tid,'123342313' tno from dual union all
     select 10 tid,'2468' tno from dual
)

select distinct tid,tno
from 
(
select distinct tid,tno,substr(tno,level+1,1)-substr(tno,level,1) c1
from t1
where length(tno) between 2 and 9
connect by level < length(tno)
order by tid
)
where c1 <> 1
order by tid


     tid    tno
--------------------------------
1 2 35
2 4 745
3 6 555
4 7 7891
5 9 123342313
6 10 2468



------解决方案--------------------
select * from t where (length(id) between 2 and 10
and not regexp_like('0123456789',t.tno))
or length(id)>=11