欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2024/1/1 编程问答 43 豆豆
生活随笔 收集整理的这篇文章主要介绍了 靓号正则表达式(前后向查找等) 和 apache正则包使用 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

  • 开源应用
正则表达式ApacheQQJDK 

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

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

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

 

 

代码如下:

Java代码  
  • public class CreditCodeRegexValidateStategyServiceImpl implements CreditCodeValidateStategyService {  
  •   
  •     private static List<String> levitPatterns;  
  •   
  •     static synchronized private void init() {  
  •         if (levitPatterns == null) {  
  •             levitPatterns = new ArrayList<String>();  
  •         } else {  
  •             return;  
  •         }  
  •         // 手机号、生日号、跟公司业务相关的号码  
  •      levitPatterns.add("^(0|13|15|18|168|400|800)[0-9]*$");  
  •         levitPatterns.add("^\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])$");  
  •         levitPatterns.add("^\\d*(1688|2688|2088|2008|5188|10010|10001|666|888|668|686|688|866|868|886|999)\\d*$");  
  •         // 重复号码,镜子号码  
  •      levitPatterns.add("^(<a>\\d)(\\d)(\\d)\\1\\2\\3$");  
  • </a>        levitPatterns.add("^(\\d)(\\d)(\\d)\\3\\2\\1$");  
  •         // AABB  
  •         levitPatterns.add("^\\d*(\\d)\\1(\\d)\\2\\d*$");  
  •         // AAABBB  
  •         levitPatterns.add("^\\d*(\\d)\\1\\1(\\d)\\2\\2\\d*$");  
  •         // ABABAB  
  •         levitPatterns.add("^(\\d)(\\d)\\1\\2\\1\\2\\1\\2$");  
  •         // ABCABC  
  •         levitPatterns.add("^(\\d)(\\d)(\\d)\\1\\2\\3$");  
  •         // ABBABB  
  •         levitPatterns.add("^(\\d)(\\d)\\2\\1\\2\\2$");  
  •         // AABAAB  
  •         levitPatterns.add("^(\\d)\\1(\\d)\\1\\1\\2$");  
  •           
  •         // 4-8 位置重复  
  •         levitPatterns.add("^\\d*(\\d)\\1{2,}\\d*$");  
  •         // 4位以上 位递增或者递减(7890也是递增)  
  •         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");  
  •           
  •         // 不能以 518 、918 结尾  
  •         levitPatterns.add("^[0-9]*(518|918)$");  
  •     }  
  •   
  •     @Override  
  •     public boolean isAllow(String input) {  
  •         Assert.notNull(input);  
  •         return !RegexUtil.contains(input, levitPatterns);  
  •     }  
  •   
  •     static {  
  •         init();  
  •     }  
  • public class CreditCodeRegexValidateStategyServiceImpl implements CreditCodeValidateStategyService {private static List<String> levitPatterns;static synchronized private void init() {if (levitPatterns == null) {levitPatterns = new ArrayList<String>();} else {return;}// 手机号、生日号、跟公司业务相关的号码levitPatterns.add("^(0|13|15|18|168|400|800)[0-9]*$");levitPatterns.add("^\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])$");levitPatterns.add("^\\d*(1688|2688|2088|2008|5188|10010|10001|666|888|668|686|688|866|868|886|999)\\d*$");// 重复号码,镜子号码levitPatterns.add("^(<a>\\d)(\\d)(\\d)\\1\\2\\3$"); </a> levitPatterns.add("^(\\d)(\\d)(\\d)\\3\\2\\1$");// AABBlevitPatterns.add("^\\d*(\\d)\\1(\\d)\\2\\d*$");// AAABBBlevitPatterns.add("^\\d*(\\d)\\1\\1(\\d)\\2\\2\\d*$");// ABABABlevitPatterns.add("^(\\d)(\\d)\\1\\2\\1\\2\\1\\2$");// ABCABClevitPatterns.add("^(\\d)(\\d)(\\d)\\1\\2\\3$");// ABBABBlevitPatterns.add("^(\\d)(\\d)\\2\\1\\2\\2$");// AABAABlevitPatterns.add("^(\\d)\\1(\\d)\\1\\1\\2$");// 4-8 位置重复levitPatterns.add("^\\d*(\\d)\\1{2,}\\d*$");// 4位以上 位递增或者递减(7890也是递增)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");// 不能以 518 、918 结尾levitPatterns.add("^[0-9]*(518|918)$");}@Overridepublic boolean isAllow(String input) {Assert.notNull(input);return !RegexUtil.contains(input, levitPatterns);}static {init();}

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

      

    Java代码  
  • // ABBABB  
  •       levitPatterns.add("^(\\d)(\\d)\\2\\1\\2\\2$");  
  • // ABBABBlevitPatterns.add("^(\\d)(\\d)\\2\\1\\2\\2$"); Java代码  
  • // 4位以上 位递增或者递减(7890也是递增)  
  •       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");  
  •         
  • // 4位以上 位递增或者递减(7890也是递增)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");

    位置查找: \\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代码  
  • public class RegexUtil {  
  •   
  •     private static PatternCompiler compiler = new Perl5Compiler();  
  •   
  •     private static PatternMatcher  matcher  = new Perl5Matcher();  
  •   
  •     private static Pattern         pattern  = null;  
  •   
  •     /** 
  •      * 根据正则过滤条件过滤 
  •      *  
  •      * @param input 
  •      * @param levitPatterns 
  •      * @return 
  •      * @throws MalformedPatternException 
  •      */  
  •     public static boolean contains(String input, String patternString) {  
  •         try {  
  •             pattern = compiler.compile(patternString);  
  •             if (matcher.contains(input, pattern)) {  
  •                 return true;  
  •             }  
  •         } catch (MalformedPatternException e) {  
  •             return false;  
  •         }  
  •         return false;  
  •     }  
  •   
  •     /** 
  •      * 根据批量正则过滤条件过滤 
  •      *  
  •      * @param input 
  •      * @param patternStrings 
  •      * @return 
  •      * @throws MalformedPatternException 
  •      */  
  •     public static boolean contains(String input, List<String> patternStrings) {  
  •         for (Iterator<String> lt = patternStrings.listIterator(); lt.hasNext();) {  
  •             if (contains(input, (String) lt.next())) {  
  •                 return true;  
  •             }  
  •             continue;  
  •         }  
  •         return false;  
  •     }  
  • }  
  • 总结

    以上是生活随笔为你收集整理的靓号正则表达式(前后向查找等) 和 apache正则包使用的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。