zoukankan      html  css  js  c++  java
  • 靓号正则表达式(前后向查找等) 和 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 }  
     
  • 相关阅读:
    br-lan、eth0、eth1及lo (转)
    openwrt MT7628 编译前更改为DHCP,root 密码、ssid、时区、主机名
    Openwrt Uboot烧写
    区块链公链“三元悖论”专题之可扩展性(Scalability)
    物联网开发|如何选择一款适合你的物联网操作系统?
    oracle 处理Session不够用
    Redis 数据总结 (2.命令实现逻辑)
    Redis 数据总结(1 数据导入)
    Redis 数据库使用和搭建
    MySql 存储大量长字节 Text报错处理办法
  • 原文地址:https://www.cnblogs.com/luowei/p/3370377.html
Copyright © 2011-2022 走看看