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

regexp_like正则表达式写法求助
使用regexp_like函数判断传入字符串是否符合格式如:1111,22221,.....,33332 
1. 逗号为各子串分割符
2. 各子串仅为数字组成,最长不超过20位
3. 字符串不能包含数字及逗号以外的字符
4. 无限定字符串包含多少个子串
------解决方案--------------------
为了你这个问题,我还真是想了很久,首先分享一个观点吧:
oracle对正则支持很浅,建议不使用在oracle中使用正则表达式,因为容易造成low performance。由于你的条件比较多,我的sql也比较复杂,肯定我的有值得优化的地方,嘿嘿,新手路过。
 WITH TS AS
 (SELECT '1111,222,3312' A FROM DUAL UNION ALL
 SELECT '1,2,3,4,5,6' FROM  DUAL UNION ALL
 SELECT '66,77' FROM  DUAL  UNION ALL
 SELECT '65,98,53' FROM  DUAL  UNION ALL
 SELECT '65,98,53' FROM  DUAL  UNION ALL
 SELECT '65,98,53' FROM  DUAL  UNION ALL
 SELECT '65,98,53' FROM  DUAL  UNION ALL
 SELECT '65,98,53' FROM  DUAL  UNION ALL
 SELECT '65,98,53' FROM  DUAL  UNION ALL
 SELECT '65,98,53' FROM  DUAL  UNION ALL
 SELECT '65,98,53' FROM  DUAL  )

 SELECT DISTINCT a,regexp_substr(a,'[[:alnum:]]+',1,level) t,LEVEL e
 from ts
    connect by level<=length(regexp_replace(a,'[[:alnum:]]+'))+1

------解决方案--------------------
引用:
Quote: 引用:

为了你这个问题,我还真是想了很久,首先分享一个观点吧:
oracle对正则支持很浅,建议不使用在oracle中使用正则表达式,因为容易造成low performance。由于你的条件比较多,我的sql也比较复杂,肯定我的有值得优化的地方,嘿嘿,新手路过。
 WITH TS AS
 (SELECT '1111,222,3312' A FROM DUAL UNION ALL
 SELECT '1,2,3,4,5,6' FROM  DUAL UNION ALL
 SELECT '66,77' FROM  DUAL  UNION ALL
 SELECT '65,98,53' FROM  DUAL  UNION ALL
 SELECT '65,98,53' FROM  DUAL  UNION ALL
 SELECT '65,98,53' FROM  DUAL  UNION ALL
 SELECT '65,98,53' FROM  DUAL  UNION ALL
 SELECT '65,98,53' FROM  DUAL  UNION ALL
 SELECT '65,98,53' FROM  DUAL  UNION ALL
 SELECT '65,98,53' FROM  DUAL  UNION ALL
 SELECT '65,98,53' FROM  DUAL  )

 SELECT DISTINCT a,regexp_substr(a,'[[:alnum:]]+',1,level) t,LEVEL e
 from ts
    connect by level<=length(regexp_replace(a,'[[:alnum:]]+'))+1



我最初的想法是直接用regexp_like来判断格式,不知道可不可行,如果一句正则表达式就能把格式覆盖的话效率就不会低,如果不行的话我是打算直接用自定义函数做

直接用实现不了,因为你每一段还有判断规则。。先按1楼的方法分割以后,再判断分割的时候存在不满足或者超过20的。。取count值即可,如果count为0即满足否者不满足。