设为首页 收藏本站
查看: 816|回复: 0

[经验分享] 靓号正则表达式(前后向查找等) 和 apache正则包使用

[复制链接]

尚未签到

发表于 2017-1-14 10:34:13 | 显示全部楼层 |阅读模式
  一般公司在开发一类对的号码时,会预留一些号码给以后升级的会员使用,比如旺旺靓号,QQ号等,采用正则表达式实现较好,通过规则引擎的后台页面做成实时可配置的也是不错的选择。
  一. 一般会有如下的正则需求
  代码中每行都标有注释,这个就是需求,为设置靓号应该考虑的方面,这里特别提示下,不能忘记跟公司相关的业务,股票代码等检查。
  代码如下:

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("^(\\d)(\\d)(\\d)\\1\\2\\3$");
        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();
}
  对于以上正则,前面的大多人都很熟悉了,这里主要讲位置查找和前后向查找,即如下两种号码的判断

  // ABBABB
levitPatterns.add("^(\\d)(\\d)\\2\\1\\2\\2$");
  // 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版本中可能会看到的。
  上面程序调用的正则代码如下:

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;
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-328253-1-1.html 上篇帖子: Apache.Tomcat整合,用cookie取代Tomcat之间Session的复制 下篇帖子: Apache Common-Configuration的使用,重点介绍对XML和Properties的读取操作
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表