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

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

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

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

 

 

代码如下:

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

 

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

  

1 Java代码  收藏代码
2 // ABBABB  
3       levitPatterns.add("^(\\d)(\\d)\\2\\1\\2\\2$");  

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

 

 
posted @ 2013-10-15 15:52  weiwei~  阅读(681)  评论(1编辑  收藏  举报