靓号正则表达式(前后向查找等) 和 apache正则包使用

前端之家收集整理的这篇文章主要介绍了靓号正则表达式(前后向查找等) 和 apache正则包使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


一般公司在开发一类对的号码时,会预留一些号码给以后升级的会员使用,比如旺旺靓号,QQ号等,采用正则表达式实现较好,通过规则引擎的后台页面做成实时可配置的也是不错的选择。

一. 一般会有如下的正则需求

代码中每行都标有注释,这个就是需求,为设置靓号应该考虑的方面,这里特别提示下,不能忘记跟公司相关的业务,股票代码等检查。

代码如下:

Java代码
  1. publicclassCreditCodeRegexValidateStategyServiceImplimplementsCreditCodeValidateStategyService{
  2. privatestaticList<String>levitPatterns;
  3. staticsynchronizedprivatevoidinit(){
  4. if(levitPatterns==null){
  5. levitPatterns=newArrayList<String>();
  6. }else{
  7. return;
  8. }
  9. //手机号、生日号、跟公司业务相关的号码
  10. levitPatterns.add("^(0|13|15|18|168|400|800)[0-9]*$");
  11. levitPatterns.add("^\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])$");
  12. levitPatterns.add("^\\d*(1688|2688|2088|2008|5188|10010|10001|666|888|668|686|688|866|868|886|999)\\d*$");
  13. //重复号码,镜子号码
  14. levitPatterns.add("^(<a>\\d)(\\d)(\\d)\\1\\2\\3$");
  15. </a>levitPatterns.add("^(\\d)(\\d)(\\d)\\3\\2\\1$");
  16. //AABB
  17. levitPatterns.add("^\\d*(\\d)\\1(\\d)\\2\\d*$");
  18. //AAABBB
  19. levitPatterns.add("^\\d*(\\d)\\1\\1(\\d)\\2\\2\\d*$");
  20. //ABABAB
  21. levitPatterns.add("^(\\d)(\\d)\\1\\2\\1\\2\\1\\2$");
  22. //ABCABC
  23. levitPatterns.add("^(\\d)(\\d)(\\d)\\1\\2\\3$");
  24. //ABBABB
  25. levitPatterns.add("^(\\d)(\\d)\\2\\1\\2\\2$");
  26. //AABAAB
  27. levitPatterns.add("^(\\d)\\1(\\d)\\1\\1\\2$");
  28. //4-8位置重复
  29. levitPatterns.add("^\\d*(\\d)\\1{2,}\\d*$");
  30. //4位以上位递增或者递减(7890也是递增)
  31. levitPatterns.add("(?:(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)|9(?=0)){2,}|(?:0(?=9)|9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){2,})\\d");
  32. //不能以518、918结尾
  33. levitPatterns.add("^[0-9]*(518|918)$");
  34. }
  35. @Override
  36. publicbooleanisAllow(Stringinput){
  37. Assert.notNull(input);
  38. return!RegexUtil.contains(input,levitPatterns);
  39. }
  40. static{
  41. init();
  42. }

对于以上正则,前面的大多人都很熟悉了,这里主要讲位置查找和前后向查找,即如下两种号码的判断

Java代码
  1. //ABBABB
  2. levitPatterns.add("^(\\d)(\\d)\\2\\1\\2\\2$");
Java代码
  1. //4位以上位递增或者递减(7890也是递增)
  2. levitPatterns.add("(?:(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)|9(?=0)){2,})\\d");

位置查找:\\2\\1\\2\\2 这部分代表的 第一个A 位置是1 第二个B位置是2,重复B则用\\2标识

后向查找 ("(?:(?:0(?=1)| 对于连续号码,?=表示往后看,要判断0后面是1吗,1后面是2吗,如此反复可以得到连续号码

二. 使用 org.apache.oro.text.regex.Pattern 代替 java自身带的partern,

为什么抛弃java现有的API不用,而使用perl5规范的正则库呢?他是最全面的正则表达式API,全面兼容perl5,同时也是优化的最好的API之一,在未来的JDK版本中可能会看到的。

上面程序调用的正则代码如下:

Java代码
  1. publicclassRegexUtil{
  2. privatestaticPatternCompilercompiler=newPerl5Compiler();
  3. privatestaticPatternMatchermatcher=newPerl5Matcher();
  4. privatestaticPatternpattern=null;
  5. /**
  6. *根据正则过滤条件过滤
  7. *
  8. *@paraminput
  9. *@paramlevitPatterns
  10. *@return
  11. *@throwsMalformedPatternException
  12. */
  13. publicstaticbooleancontains(Stringinput,StringpatternString){
  14. try{
  15. pattern=compiler.compile(patternString);
  16. if(matcher.contains(input,pattern)){
  17. returntrue;
  18. }
  19. }catch(MalformedPatternExceptione){
  20. returnfalse;
  21. }
  22. returnfalse;
  23. }
  24. /**
  25. *根据批量正则过滤条件过滤
  26. *
  27. *@paraminput
  28. *@parampatternStrings
  29. *@return
  30. *@throwsMalformedPatternException
  31. */
  32. publicstaticbooleancontains(Stringinput,List<String>patternStrings){
  33. for(Iterator<String>lt=patternStrings.listIterator();lt.hasNext();){
  34. if(contains(input,(String)lt.next())){
  35. returntrue;
  36. }
  37. continue;
  38. }
  39. returnfalse;
  40. }
  41. }

猜你在找的正则表达式相关文章