以前真的没怎么认真考虑一个正则匹配应该怎么写,自从昨天看了一位老师的正则表达式的讲解,感觉也不难,基本简单的多写几次就来感觉了,下面是我自己边学习边记录写的几个正则表达式。经过校验大部分还算正确,余下有bug部分后期再修复
package regex;
public class RegexDemo {
public static void main(String[] args) {
// runTest();
// police();
// phone400();
IDCard();
}
/**
* 校验身份证:
* 身份证规则
* 前两位代表省份,11-65
* 后四位位代表城市所在的区,
* 后8位代表出生年月日,
* 最后四位代表校验结果,最后一位可能为X
* 总计18位数(最后一位有可能是X)
*/
private static void IDCard() {
// String IDCardRegex = "[1-6|1-5{2}]\\d{4}1\\d{3}(0\\d|11|12)[\\d{4}]";
//示例 :4222011956129999
// String IDCardRegex = "([1-6]|[1-5]){2}\d{4}1\d{3}(0\d|10|11|12)(\d|X){4}";
//身份证前两位:([1-6]|[1-5]) 继续后四位:\d{4} 后四位出生年份:1\d{3} 月份:(0\d|10|11|12) 身份证最后四位 \d{4}
// String IDCardRegex = "([1-6]|[1-5]){2}\\d{4}1\\d{3}(0\\d|10|11|12)(\\d|X){4}";
//----------------------------------下面是完整版本身份证的正则表达式------------------------------------//
/**
* 完整版本身份证正则:
* 身份证前两位:([1-6]|[1-5])
* 继续后四位:\d{4}
* 后四位出生年份:1\d{3}
* 月份:(0\d|10|11|12)
* 代表出生日:([0-2]\d|30)
* 身份证最后四位 \d{4}
*/
// String IDCardRegex = "([1-6]|[1-5]){2}\\d{4}1\\d{3}(0\\d|10|11|12)([0-2]\\d|30|31)(\\d|X){4}";
//支持2000年后的版本,最大支持2023年出生孩子的身份证信息
// 代表1000-2023年:(1\d{3}|(200\d|201\d|202[0-3]))->也可这样写:(1\d{3}|20(0\d|1\d|2[0-3]))
String IDCardRegex = "([1-6]|[1-5]){2}\\d{4}(1\\d{3}|20(0\\d|1\\d|2[0-3]))(0\\d|10|11|12)([0-2]\\d|30|31)(\\d|X){4}";
System.err.println("42220120231231999X".matches(IDCardRegex));//true
System.err.println("72220120231231999X".matches(IDCardRegex));//身份证开头没有7 false
System.err.println("42220120241231999X".matches(IDCardRegex));//大于2023年false
System.err.println("42220120231531999X".matches(IDCardRegex));//大于12月false
System.err.println("42220120231241999X".matches(IDCardRegex));//大于31号false
System.err.println("42220120231231999a".matches(IDCardRegex));//非数字或者X false
}
/**
* 400-电话正则
* 一般以400开头,后面可能是-也可能数空格
* 一般长度10位加上空格或者-的话总计12位
*/
private static void phone400() {
//这个规则可能会出现不正确的情况
//类似这两种:400-1234-5555(长度超过了10位) 400-333-333(长度不够10位)
String phoneRegex = "400([\\s|-]\\d{3,4}){2}";
//下面是固定规则400开头再加3位数字最后加四位数字
String phoneRegexTure = "400[\\s|-]\\d{3}[\\s|-]\\d{4}";
System.err.println("400 234 7777".matches(phoneRegexTure));
System.err.println("400-234-0000".matches(phoneRegexTure));
}
/**
* 紧急急救电话正则
* 一般是3位数,第一位1开头,第二位1或者2开头
* 举例:110 120 119
*/
private static void police() {
String policeRegex = "1[1-2]\\d";
String policeRegex2 = "1[1-2][0|9]";
System.err.println("120".matches(policeRegex2));
}
/**
* 验证目前最新的手机号
* 规则:
* 第一位是1开头,第二位可以是3-9之间的任意数字
* 从第三位开始可以是任意数字
*/
private static void runTest() {
String regex = "1[^1-2]\\d{9}";
System.out.println("11155225158".matches(regex));
}
}
如上所示,分别写了验证手机号,验证紧急电话、验证400开头企业电话、验证身份证号码(身份证号码已支持2000年后出生孩子的身份证信息校验了)。基本分析和注释都写在下面了,看不懂没关系,自己跟着多写几次理解了就懂了
身份证介绍比较详细的文章可以看这个:身份证前6位代表含义的详细说明