Java基础系列之正则表达式

Java在处理一些复杂的字符串操作时,往往不是通过String中函数实现的,而是通过Java中正则表达式实现的。

下面通过一个具体的例子简单的介绍一下Java中正则表达式具体的用法。

package myapi.regex.demo;
public interface RegularInterface {
	public boolean checkDigit(String input);
	public boolean checkMail(String input);
	public boolean checkPhone(String input);
	public boolean checkIDCard(String input);
	public boolean checkDate(String input);
	public boolean checkDateTime(String input);
}

package myapi.regex.demo;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import myapi.time.demo.JavaTimeApi;
public class MyRegexApi implements RegularInterface {
	public MyRegexApi() {
		
	}
	private static Map<String,String>map=new HashMap<String,String>();
	static{
		map.put("11","北京");map.put("12","天津");map.put("13","河北");map.put("14","山西");map.put("15","内蒙古");
		map.put("21","辽宁");map.put("22","吉林");map.put("23","黑龙江");map.put("31","上海");map.put("32","江苏");
		map.put("33","浙江");map.put("34","安徽");map.put("35","福建");map.put("36","江西");map.put("37","山东");
		map.put("41","河南");map.put("42","湖北");map.put("43","湖南");map.put("44","广东");map.put("45","广西");
		map.put("46","海南");map.put("50","重庆");map.put("51","四川");map.put("52","贵州");map.put("53","云南");
		map.put("54","西藏");map.put("61","陕西");map.put("62","甘肃");map.put("63","青海");map.put("64","宁夏");
		map.put("65","新疆");map.put("71","台湾");map.put("81","香港");map.put("82","澳门");map.put("91","国外");
	}
	public static void main(String[] args) {
		MyRegexApi m = new MyRegexApi();
		System.out.println(m.checkIDCard("340822198007265519"));
	}

	/**
	 * @author qiang
	 * @param input
	 *            输入条件
	 * @return boolean 判断输入条件是否是数字,是返回true,不是返回false
	 */
	@Override
	public boolean checkDigit(String input) {
		Pattern p = Pattern.compile("^[0-9]{1,20}$");
		Matcher m = p.matcher(input);
		return m.matches();
	}

	@Override
	public boolean checkMail(String input) {
		Pattern p = Pattern
				.compile("^([a-zA-Z0-9_\\.\\-])+\\@(([a-zA-Z0-9\\-])+\\.)+([a-zA-Z0-9]{2,4})+$");
		Matcher m = p.matcher(input);
		return m.matches();
	}

	@Override
	public boolean checkPhone(String input) {
		Pattern p = Pattern.compile("^1[3|4|5|7|8]\\d{9}$");
		Matcher m = p.matcher(input);
		return m.matches();
	}

	@Override
	public boolean checkIDCard(String input) {
		boolean flags[]={checkIDCard_specification(input),checkIDCard_Province(input),
			checkIDCard_checkBirthday(input),checkIDCard_checkParity(input)};
		for(int i=0;i<flags.length;i++){
			if(flags[i]==false){
				return false;
			}
		}
		return true;
	}

	public boolean checkIDCard_specification(String input){
		Pattern p = Pattern.compile("(^\\d{15}$)|(^\\d{17}(\\d|X)$)");
		Matcher m = p.matcher(input);
		return m.matches();
	}
	
	public boolean checkIDCard_Province(String input){
		if(map.get(input.substring(0,2))!=null && map.containsKey(input.substring(0,2))){
			return true;
		}else{
			return false;
		}
	}
	
	public boolean checkIDCard_checkBirthday(String input){
		Pattern p=null;
		Matcher m=null;
		if(input.length()==15){
			 p = Pattern.compile("^(\\d{6})(\\d{2})(\\d{2})(\\d{2})(\\d{3})$");
			 m = p.matcher(input);
			 if(m.matches()){
				 int year=Integer.valueOf("19"+input.substring(6, 8));
				 int month=Integer.valueOf(input.substring(8, 10));
				 int day=Integer.valueOf(input.substring(10, 12));
				 return checkIDCard_Birthday(year,month,day);
			 }else{
				 return false;
			 }
			
		}else if(input.length()==18){
			 p = Pattern.compile("^(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9]|X)$");
			 m = p.matcher(input);
			 if(m.matches()){
				 int year=Integer.valueOf(input.substring(6, 10));
				 int month=Integer.valueOf(input.substring(10, 12));
				 int day=Integer.valueOf(input.substring(12, 14));
				 return checkIDCard_Birthday(year,month,day);
			 }else{
				 return false;
			 }
		}else{
			return false;
		}
	}
	
	public boolean checkIDCard_Birthday(int year,int month,int day){
		Calendar cal = Calendar.getInstance();
		int lastDay=JavaTimeApi.getLastDayOfMonth(year, month);
		int currentYear=cal.get(Calendar.YEAR);
		if((currentYear-year<3) || (currentYear-year>101)){
			return false;
		}else if(month<1 || month>12){
			return false;
		}else if(day<1 || day>lastDay){
			return false;
		}
		return true;
	}
	
	public boolean checkIDCard_checkParity(String input){
		if(input.length()==15){
			input=checkIDCard_changeNumber(input);
		}
		int arrInt[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; 
		char arrCh[] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
		int cartTemp=0,valnum=0;
		for(int i = 0; i < 17; i ++){
			cartTemp+=Integer.valueOf(input.charAt(i)+"")*arrInt[i];
		}
		valnum=arrCh[cartTemp%11];
		if(valnum==input.charAt(17)){
			return true;
		}else{
			return false;
		}
	}
	
	public String checkIDCard_changeNumber(String input){
		int arrInt[] = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}; 
		char arrCh[] = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
		String obj=input.substring(0, 6)+"19"+input.substring(6, input.length());
		int cartTemp=0;
		for(int i = 0; i < 17; i ++){
			cartTemp+=Integer.valueOf(input.charAt(i))*arrInt[i];
		}
		obj+=arrCh[cartTemp%11];
		return obj;
	}
	@Override
	public boolean checkDate(String input) {
		Pattern p = Pattern
				.compile("((^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/\\._])(10|12|0?[13578])([-\\/\\._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/\\._])(11|0?[469])([-\\/\\._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/\\._])(0?2)([-\\/\\._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([3579][26]00)([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([1][89][0][48])([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([2-9][0-9][0][48])([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([1][89][2468][048])([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([2-9][0-9][2468][048])([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([1][89][13579][26])([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([2-9][0-9][13579][26])([-\\/\\._])(0?2)([-\\/\\._])(29)$))");
		Matcher m = p.matcher(input);
		return m.matches();
	}

	@Override
	public boolean checkDateTime(String input) {
		if(input.split(" ").length!=2){
			return false;
		}
		String datas=input.split(" ")[0];
		String times=input.split(" ")[1];
		Pattern p_datas = Pattern.compile("((^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/\\._])(10|12|0?[13578])([-\\/\\._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/\\._])(11|0?[469])([-\\/\\._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]\\d{2})|([2-9]\\d{3}))([-\\/\\._])(0?2)([-\\/\\._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([3579][26]00)([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([1][89][0][48])([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([2-9][0-9][0][48])([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([1][89][2468][048])([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([2-9][0-9][2468][048])([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([1][89][13579][26])([-\\/\\._])(0?2)([-\\/\\._])(29)$)|(^([2-9][0-9][13579][26])([-\\/\\._])(0?2)([-\\/\\._])(29)$))");
		Matcher m_datas = p_datas.matcher(datas);
		Pattern p_times = Pattern.compile("^(([01]?[0-9])|(2[0-3])):[0-5]?[0-9]:[0-5]?[0-9]$");
		Matcher m_times = p_times.matcher(times);
		if(m_datas.matches() && m_times.matches()){
			return true;
		}else{
			return false;
		}
	}
}

上面的例子详细的介绍了,在Java中如何通过使用正则表达式进行电话号码,身份证,日期,数字,邮箱,URL等的验证。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏刘笑江的专栏

通过Swift学函数式编程

在文章SWIFT IS A LOT LIKE SCALA [1] 提到Swift和Scala有很大的相似之处,在某些特性甚至比Scala对函数式编程的支持更友好...

1605
来自专栏Ryan Miao

如何从两个List中筛选出相同的值

问题 现有社保卡和身份证若干,想要匹配筛选出一一对应的社保卡和身份证。 转换为List<社保卡> socialList,和List idList,从二者中找出...

3209
来自专栏大内老A

关于Expression Tree和IL Emit的所谓的"性能差别"

昨天写了《三种属性操作性能比较》,有个网友写信问我一个问题:从性能上看,Expression Tree和IL Emit孰优孰劣?虽然我在回信中作了简单的回答,但...

2685
来自专栏IT可乐

Java 枚举类 详解

1、枚举是什么?   Java中的枚举其实是一种语法糖,在 JDK 1.5之后出现,用来表示固定且有限个的对象。比如一个季节类有春、夏、秋、冬四个对象;一个星期...

1929
来自专栏深度学习与计算机视觉

建模-判断一列数是不是等差数列

题目: 如果一个数列S满足对于所有的合法的i,都有S[i + 1] = S[i] + d, 这里的d也可以是负数和零,我们就称数列S为等差数列。 小易现...

1996
来自专栏小灰灰

FastJson 反序列化注意事项

问题描述 使用fastJson对json字符串进行反序列化时,有几个点需要注意一下: 反序列化内部类 反序列化模板类 0. Getter/Setter问题 如我...

1.1K8
来自专栏草根专栏

用C#(.NET Core) 实现简单工厂和工厂方法设计模式

本文源自深入浅出设计模式. 只不过我是使用C#/.NET Core实现的例子. 前言 当你看见new这个关键字的时候, 就应该想到它是具体的实现. ? 这就是一...

5264
来自专栏HansBug's Lab

1622: [Usaco2008 Open]Word Power 名字的能量

1622: [Usaco2008 Open]Word Power 名字的能量 Time Limit: 5 Sec  Memory Limit: 64 MB Su...

2534
来自专栏码匠的流水账

聊聊storm WindowTridentProcessor的FreshCollector

本文主要研究一下storm WindowTridentProcessor的FreshCollector

743
来自专栏软件开发

JavaSE学习总结(三)——Java语言编程练习、格式化字符与常量

一、变量、常量、字面量 package com.zhangguo.chapter2_3; /** * 1、银行利率为5%,问存款100美元5年的收益细节? ...

2148

扫码关注云+社区