一. 一般会有如下的正则需求
参考文档:菜鸟教程(正则表达式)
代码如下:
- publicclassCreditCodeRegexValidateStategyServiceImplimplementsCreditCodeValidateStategyService{
- privatestaticList<String>levitPatterns;
- staticsynchronizedvoidinit(){
- if(levitPatterns==null){
- levitPatterns=newArrayList<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("^(<a>\\d)(\\d)(\\d)\\1\\2\\3$");
- </a>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
- booleanisAllow(Stringinput){
- Assert.notNull(input);
- return!RegexUtil.contains(input,levitPatterns);
- static{
- init();
- }
对于以上正则,前面的大多人都很熟悉了,这里主要讲位置查找和前后向查找,即如下两种号码的判断
levitPatterns.add("^(\\d)(\\d)\\2\\1\\2\\2$");
位置查找:\\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版本中可能会看到的。
classRegexUtil{
staticPatternCompilercompiler=newPerl5Compiler();
staticPatternMatchermatcher=newPerl5Matcher();
staticPatternpattern=null;
/**
*根据正则过滤条件过滤
*
*@paraminput
*@paramlevitPatterns
*@return
*@throwsMalformedPatternException
*/
booleancontains(Stringinput,StringpatternString){
try{
pattern=compiler.compile(patternString);
if(matcher.contains(input,pattern)){
returntrue;
catch(MalformedPatternExceptione){
false;
*根据批量正则过滤条件过滤
*@parampatternStrings
for(Iterator<String>lt=patternStrings.listIterator();lt.hasNext();){
if(contains(input,(String)lt.next())){
continue;
}
原文链接:https://www.f2er.com/regex/358699.html