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

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


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

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

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

代码如下:

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

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

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

位置查找:@L_502_11@ 这部分代表的 第一个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. @H_502_24@public@H_502_24@class@H_502_24@RegexUtil{
  2. @H_502_24@
  3. @H_502_24@private@H_502_24@static@H_502_24@PatternCompilercompiler=new@H_502_24@Perl5Compiler();
  4. @H_502_24@
  5. @H_502_24@private@H_502_24@static@H_502_24@PatternMatchermatcher=new@H_502_24@Perl5Matcher();
  6. @H_502_24@
  7. @H_502_24@private@H_502_24@static@H_502_24@Patternpattern=null@H_502_24@;
  8. @H_502_24@
  9. @H_502_24@/**
  10. @H_502_24@*根据正则过滤条件过滤
  11. @H_502_24@*
  12. @H_502_24@*@paraminput
  13. @H_502_24@*@paramlevitPatterns
  14. @H_502_24@*@return
  15. @H_502_24@*@throwsMalformedPatternException
  16. @H_502_24@*/@H_502_24@
  17. @H_502_24@public@H_502_24@static@H_502_24@boolean@H_502_24@contains(Stringinput,StringpatternString){
  18. @H_502_24@try@H_502_24@{
  19. @H_502_24@pattern=compiler.compile(patternString);
  20. @H_502_24@if@H_502_24@(matcher.contains(input,pattern)){
  21. @H_502_24@return@H_502_24@true@H_502_24@;
  22. @H_502_24@}
  23. @H_502_24@}catch@H_502_24@(MalformedPatternExceptione){
  24. @H_502_24@return@H_502_24@false@H_502_24@;
  25. @H_502_24@}
  26. @H_502_24@return@H_502_24@false@H_502_24@;
  27. @H_502_24@}
  28. @H_502_24@
  29. @H_502_24@/**
  30. @H_502_24@*根据批量正则过滤条件过滤
  31. @H_502_24@*
  32. @H_502_24@*@paraminput
  33. @H_502_24@*@parampatternStrings
  34. @H_502_24@*@return
  35. @H_502_24@*@throwsMalformedPatternException
  36. @H_502_24@*/@H_502_24@
  37. @H_502_24@public@H_502_24@static@H_502_24@boolean@H_502_24@contains(Stringinput,List<String>patternStrings){
  38. @H_502_24@for@H_502_24@(Iterator<String>lt=patternStrings.listIterator();lt.hasNext();){
  39. @H_502_24@if@H_502_24@(contains(input,(String)lt.next())){
  40. @H_502_24@return@H_502_24@true@H_502_24@;
  41. @H_502_24@}
  42. @H_502_24@continue@H_502_24@;
  43. @H_502_24@}
  44. @H_502_24@return@H_502_24@false@H_502_24@;
  45. @H_502_24@}
  46. @H_502_24@}

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