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

转载 2015年02月04日 16:01:18


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

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

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

 

 

代码如下:

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

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

  

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,}|(?:0(?=9)|9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){2,})\\d");  
  3.         

位置查找: \\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. public class RegexUtil {  
  2.   
  3.     private static PatternCompiler compiler = new Perl5Compiler();  
  4.   
  5.     private static PatternMatcher  matcher  = new Perl5Matcher();  
  6.   
  7.     private static Pattern         pattern  = null;  
  8.   
  9.     /** 
  10.      * 根据正则过滤条件过滤 
  11.      *  
  12.      * @param input 
  13.      * @param levitPatterns 
  14.      * @return 
  15.      * @throws MalformedPatternException 
  16.      */  
  17.     public static boolean contains(String input, String patternString) {  
  18.         try {  
  19.             pattern = compiler.compile(patternString);  
  20.             if (matcher.contains(input, pattern)) {  
  21.                 return true;  
  22.             }  
  23.         } catch (MalformedPatternException e) {  
  24.             return false;  
  25.         }  
  26.         return false;  
  27.     }  
  28.   
  29.     /** 
  30.      * 根据批量正则过滤条件过滤 
  31.      *  
  32.      * @param input 
  33.      * @param patternStrings 
  34.      * @return 
  35.      * @throws MalformedPatternException 
  36.      */  
  37.     public static boolean contains(String input, List<String> patternStrings) {  
  38.         for (Iterator<String> lt = patternStrings.listIterator(); lt.hasNext();) {  
  39.             if (contains(input, (String) lt.next())) {  
  40.                 return true;  
  41.             }  
  42.             continue;  
  43.         }  
  44.         return false;  
  45.     }  
  46. }  

正则表达式判断号码靓号类型

很多网站需要将好的会员号留着,或用于日后的盈利。实现方法不是本文讨论范围,本文仅列出用于检测靓号类型的一些正则。   靓号检测:主要可以检测连号(正连 12345、倒连65432)、AABB号、手机...
  • iiiiiiiiiiii9
  • iiiiiiiiiiii9
  • 2014年04月12日 15:29
  • 1543

正则表达式(靓号过滤)

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

正则表达式靓号的检测

需要用到的,先记录一下: //匹配6位顺增 string pattern = "(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)...
  • lingxyd_0
  • lingxyd_0
  • 2014年01月07日 11:44
  • 3069

apache rewrite 正则表达式基础

apache rewrite实战两种场景介绍
  • fifa_016
  • fifa_016
  • 2014年09月01日 13:40
  • 805

Apache重写与正则表达式经验总结

  • 2012年02月18日 22:34
  • 182KB
  • 下载

正则表达式(靓号过滤)

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

正则表达式靓号的检测

需要用到的,先记录一下: //匹配6位顺增 string pattern = "(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)...
  • lingxyd_0
  • lingxyd_0
  • 2014年01月07日 11:44
  • 3069

apache rewrite 正则表达式基础

apache rewrite实战两种场景介绍
  • fifa_016
  • fifa_016
  • 2014年09月01日 13:40
  • 805

固定电话+手机号码正则表达式

区号+座机号码+分机号码:regexp="^(0[0-9]{2,3}/-)?([2-9][0-9]{6,7})+(/-[0-9]{1,4})?$" 手机(中国移动手机号码):regexp="^(...
  • wangkai598
  • wangkai598
  • 2015年11月10日 14:33
  • 11531

Java工具类——常用正则表达式工具RegexpUtils

[java] view plain copy   package com.test.core.util;      import org.apache.log4j.Lo...
  • xyw591238
  • xyw591238
  • 2016年06月20日 13:09
  • 1372
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:靓号正则表达式(前后向查找等) 和 apache正则包使用
举报原因:
原因补充:

(最多只允许输入30个字)