💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
http://www.cnblogs.com/mephisto/p/3456992.html [TOC] 原地址:[http://pfeishao.blog.163.com/blog/static/18162337020112113130453/](http://pfeishao.blog.163.com/blog/static/18162337020112113130453/) ------------------------------------------------------------------------                        IP的正则表达式 ------------------------------------------------------------------------ Pv4地址 正则表达式:^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$ 测试环境:Javascript/.Net/C++/JAVA 特点:匹配IPv4地址 IPv6地址 正则表达式:^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}$ 测试环境:Javascript/.Net/C++/JAVA 特点:支持IPv6的基本格式 IPv6地址 正则表达式:^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}|:((:[\da−fA−F]1,4)1,6|:)|:((:[\da−fA−F]1,4)1,6|:)|^[\da-fA-F]{1,4}:((:[\da-fA-F]{1,4}){1,5}|:)|([\da−fA−F]1,4:)2((:[\da−fA−F]1,4)1,4|:)|([\da−fA−F]1,4:)2((:[\da−fA−F]1,4)1,4|:)|^([\da-fA-F]{1,4}:){3}((:[\da-fA-F]{1,4}){1,3}|:)|([\da−fA−F]1,4:)4((:[\da−fA−F]1,4)1,2|:)|([\da−fA−F]1,4:)4((:[\da−fA−F]1,4)1,2|:)|^([\da-fA-F]{1,4}:){5}:([\da-fA-F]{1,4})?|([\da−fA−F]1,4:)6:|([\da−fA−F]1,4:)6: 测试环境:Javascript/.Net/C++/JAVA 特点:支持压缩 IPv6地址 正则表达式:^([\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)|::([\da−fA−F]1,4:)0,4((25[0−5]|2[0−4]\d|[01]?\d\d?)\.)3(25[0−5]|2[0−4]\d|[01]?\d\d?)|::([\da−fA−F]1,4:)0,4((25[0−5]|2[0−4]\d|[01]?\d\d?)\.)3(25[0−5]|2[0−4]\d|[01]?\d\d?)|^([\da-fA-F]{1,4}:):([\da-fA-F]{1,4}:){0,3}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)|([\da−fA−F]1,4:)2:([\da−fA−F]1,4:)0,2((25[0−5]|2[0−4]\d|[01]?\d\d?)\.)3(25[0−5]|2[0−4]\d|[01]?\d\d?)|([\da−fA−F]1,4:)2:([\da−fA−F]1,4:)0,2((25[0−5]|2[0−4]\d|[01]?\d\d?)\.)3(25[0−5]|2[0−4]\d|[01]?\d\d?)|^([\da-fA-F]{1,4}:){3}:([\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)|([\da−fA−F]1,4:)4:((25[0−5]|2[0−4]\d|[01]?\d\d?)\.)3(25[0−5]|2[0−4]\d|[01]?\d\d?)|([\da−fA−F]1,4:)4:((25[0−5]|2[0−4]\d|[01]?\d\d?)\.)3(25[0−5]|2[0−4]\d|[01]?\d\d?) 测试环境:Javascript/.Net/C++/JAVA 特点:只支持IPv6/IPv4混合地址。前面IPv6部分支持压缩 IPv6地址 正则表达式:^([\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)|::([\da−fA−F]1,4:)0,4((25[0−5]|2[0−4]\d|[01]?\d\d?)\.)3(25[0−5]|2[0−4]\d|[01]?\d\d?)|::([\da−fA−F]1,4:)0,4((25[0−5]|2[0−4]\d|[01]?\d\d?)\.)3(25[0−5]|2[0−4]\d|[01]?\d\d?)|^([\da-fA-F]{1,4}:):([\da-fA-F]{1,4}:){0,3}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)|([\da−fA−F]1,4:)2:([\da−fA−F]1,4:)0,2((25[0−5]|2[0−4]\d|[01]?\d\d?)\.)3(25[0−5]|2[0−4]\d|[01]?\d\d?)|([\da−fA−F]1,4:)2:([\da−fA−F]1,4:)0,2((25[0−5]|2[0−4]\d|[01]?\d\d?)\.)3(25[0−5]|2[0−4]\d|[01]?\d\d?)|^([\da-fA-F]{1,4}:){3}:([\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)|([\da−fA−F]1,4:)4:((25[0−5]|2[0−4]\d|[01]?\d\d?)\.)3(25[0−5]|2[0−4]\d|[01]?\d\d?)|([\da−fA−F]1,4:)4:((25[0−5]|2[0−4]\d|[01]?\d\d?)\.)3(25[0−5]|2[0−4]\d|[01]?\d\d?)|^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}|:((:[\da−fA−F]1,4)1,6|:)|:((:[\da−fA−F]1,4)1,6|:)|^[\da-fA-F]{1,4}:((:[\da-fA-F]{1,4}){1,5}|:)|([\da−fA−F]1,4:)2((:[\da−fA−F]1,4)1,4|:)|([\da−fA−F]1,4:)2((:[\da−fA−F]1,4)1,4|:)|^([\da-fA-F]{1,4}:){3}((:[\da-fA-F]{1,4}){1,3}|:)|([\da−fA−F]1,4:)4((:[\da−fA−F]1,4)1,2|:)|([\da−fA−F]1,4:)4((:[\da−fA−F]1,4)1,2|:)|^([\da-fA-F]{1,4}:){5}:([\da-fA-F]{1,4})?|([\da−fA−F]1,4:)6:|([\da−fA−F]1,4:)6: 测试环境:Javascript/.Net/C++/JAVA 特点:支持所有格式的IPv6地址 分析:        IPv4:通常用点分十进制表示IP地址。IP地址长4个字节共32位,点分十进制将其分为4部分,中间用“.”号分开,所以每部分共8位,二进制为“00000000”到“11111111”,十进制为“0”到“255”。        IPv6:由128位(8*16),分8段,每段16位,段与段之间用“:”分开,用十六进制表示,格式FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF,IPv6地址可以压缩。 IPv4匹配: 0.0.0.0 255.255.255.255 192.168.1.1 0.0.0.1 01.1.1.1 5.025.25.25 IPv4不匹配: 111.111.111.256 IPv6匹配: 5e:0:0:0:0:0:5668:eeee 5e:0:0:023:0:0:5668:eeee 5e::5668:eeee ::1:8:8888:0:0:8 1:: ::1:2:2:2 :: IPv6不匹配: 5e::5668::eeee 55555:5e:0:0:0:0:0:5668:eeee IPv6/IPv4混合地址匹配: 11:11:e:1EEE:11:11:200.200.200.200 e:ee:5:e::0.0.0.254 ::EfE:120.0.0.1 ::120.0.0.1 ee:ee::11.11.11.125 另一个版本如下: ~~~ package com.hx78.regex; import java.util.regex.Pattern; public class IpTest1 { private static Pattern pattern; private static Pattern ptipv4; static { // ipv6 pattern = Pattern.compile("^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:)|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}(:[0-9A-Fa-f]{1,4}){1,2})|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){1,3})|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){1,4})|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){1,5})|([0-9A-Fa-f]{1,4}:(:[0-9A-Fa-f]{1,4}){1,6})|(:(:[0-9A-Fa-f]{1,4}){1,7})|(([0-9A-Fa-f]{1,4}:){6}(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(([0-9A-Fa-f]{1,4}:){5}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|([0-9A-Fa-f]{1,4}:(:[0-9A-Fa-f]{1,4}){0,4}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(:(:[0-9A-Fa-f]{1,4}){0,5}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}))$"); // ipv4 ptipv4 = Pattern.compile("^(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}$"); } public static void main( String[] args ) { System.out.println(pattern.matcher("2001:0DB8:0000:0023:0008:0800:200C:417A").matches()); System.out.println(pattern.matcher("2001:DB8:0:23:8:800:200C:417A").matches()); System.out.println(pattern.matcher("2001:DB8:0:23:8:800:192.1.0.0").matches()); System.out.println(pattern.matcher("2001:DB8:0::800:192.1.0.0").matches()); System.out.println(pattern.matcher("2001:DB8:0:23::192.1.0.0").matches()); System.out.println(pattern.matcher("::192.1.0.0").matches()); System.out.println(pattern.matcher("1:af::3").matches()); System.out.println(pattern.matcher("1:af::").matches()); System.out.println(pattern.matcher("::1:af:0").matches()); System.out.println(pattern.matcher("::0").matches()); System.out.println("---------------------"); System.out.println(pattern.matcher("+2001:0DB8:0000:0023:0008:0800:200C:417A").matches()); System.out.println(pattern.matcher("2001:0DB8:0z00:0023:0008:0800:200C:417A").matches()); System.out.println(pattern.matcher("2001:DB8:0:23:800::192.1.0.0.1").matches()); System.out.println(pattern.matcher("2001:DB8::23::800:192.1.0.0").matches()); System.out.println(pattern.matcher(":::").matches()); System.out.println(pattern.matcher("1:::2").matches()); System.out.println("---------------------"); System.out.println(ptipv4.matcher("1.1.0.1").matches()); System.out.println(ptipv4.matcher("123.1.0.19").matches()); System.out.println(ptipv4.matcher("255.255.255.255").matches()); System.out.println(ptipv4.matcher("0.0.0.0").matches()); System.out.println("---------------------"); System.out.println(ptipv4.matcher("-1.1.0.1").matches()); System.out.println(ptipv4.matcher("1.1b.0.1").matches()); System.out.println(ptipv4.matcher("1.01.0.1").matches()); System.out.println(ptipv4.matcher("1.1.300.1").matches()); System.out.println(ptipv4.matcher("1.1..1").matches()); System.out.println("##########true############"); System.out.println(pattern.matcher("5e:0:0:0:0:0:5668:eeee").matches()); System.out.println(pattern.matcher("5e:0:0:023:0:0:5668:eeee").matches()); System.out.println(pattern.matcher("5e::5668:eeee").matches()); System.out.println(pattern.matcher("::1:8:8888:0:0:8").matches()); System.out.println(pattern.matcher("1::").matches()); System.out.println(pattern.matcher("::1:2:2:2").matches()); System.out.println(pattern.matcher("::").matches()); System.out.println("---------false------------"); System.out.println(pattern.matcher("5e::5668::eeee").matches()); System.out.println(pattern.matcher("55555:5e:0:0:0:0:0:5668:eeee").matches()); System.out.println("--------true-------------"); System.out.println(ptipv4.matcher("0.0.0.0").matches()); System.out.println(ptipv4.matcher("255.255.255.255").matches()); System.out.println(ptipv4.matcher("192.168.1.1").matches()); System.out.println(ptipv4.matcher("0.0.0.1").matches()); System.out.println(ptipv4.matcher("01.1.1.1").matches()); System.out.println(ptipv4.matcher("5.025.25.25").matches()); System.out.println("---------false------------"); System.out.println(ptipv4.matcher("111.111.111.256").matches()); } } ~~~ ------------------------------------------------------------------------                        小数的正则表达式 ------------------------------------------------------------------------ 小数 正则表达式:^([-+]?[1-9]\d*\.\d+|-?0\.\d*[1-9]\d*)$ 测试环境:.NET/Javascript 分析:        不考滤科学计数法。 匹配: 0.012 0.000000005 -0.000000005 1.00001 -1.000000010 24.215 +2.25 1.0         不匹配: 0.0 0000.02 001.001 1.1.1 ------------------------------------------------------------------------                        E-mail地址的正则表达式 ------------------------------------------------------------------------ E-mail地址 正则表达式:^[a-zA-Z0-9]((?测试环境:.NET/C++ 特点:域名部分可以为IP地址,不考滤域名部分为主机名的情况,域名部分不能保证总长度在256字符以内。 分析:        E-mail地址分三部分:        第一部分:用户帐号。        第二部分:“@”符号(英文单词“at”的符号化)。        第三部分:域名或者IP地址。        您的邮箱名应该由a-Z、A-Z、0-9开头,邮箱名可由英文字母、0~9的数字、点、减号或下划线组成;邮箱名长度为3~18个字符;邮箱名不能以点、减号或下划线结尾,不能出现连续两个或两个以上的点、减号。 匹配: 321635@qq.com 3565352@10.0.0.1 dslfklds3546_.-dl@dlsk.com lsdkf__dlskflk@ds.com 不匹配: adfd@hostname sdfsdlk..ldsfil@ds.com aa@d.com -dfddsf@ad.com ------------------------------------------------------------------------                        手机号码的正则表达式 ------------------------------------------------------------------------ 手机 正则表达式:^((\+86)?|\+86\+86)0?1[358]\d{9}$ 测试环境:.Net 分析:        手机号码长度11位,以 1 开头,第二位是 3、5 或者 8 (好像有了189开头的号码了)。 匹配: 13111111111 015111111111 +8613111111111 +8615111111111 +86015111111111 (+86)13111111111 不匹配: 11111111111 131111111 151111111111 ------------------------------------------------------------------------                        域名的正则表达式 ------------------------------------------------------------------------ 正则表达式:^([0-9a-zA-Z][0-9a-zA-Z-]{0,62}\.)+([0-9a-zA-Z][0-9a-zA-Z-]{0,62})\.?$ 测试环境:.NET/Javascript/C++ 特点:无法保证全长在256字符以内。 分析:        一个完整的域名,由根域、顶级域、二级、三级……域名构成,每级域名之间用点分开,每级域名由字母、数字和减号构成(第一个字母不能是减号),不区分大小写,单个域长度不超过63,完整的域名全长不超过256个字符。在DNS系统中,全名是以一个点“.”来结束的,例如“www.nit.edu.cn.”。没有最后的那个点则表示一个相对地址。 匹配: www.baidu.com sd-.2222222.22222222222.222222222222222.22222222.222222222.dfsd.cslkd 不匹配: sdlkk.ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd.cn ------------------------------------------------------------------------                        固定电话的正则表达式 ------------------------------------------------------------------------ 区号:^0?([1-9]\d|[3-9][13579]\d|[3-9][24680]\d{2})$ 国家代码:+86 正则表达式:\+86 区号-市话号码                        如:10-11111111,010-11111111 正则表达式:^0?([1-9]\d-\d{6,8}|[3-9][13579]\d-\d{6,7}|[3-9][24680]\d{2}-\d{6})$ 区号-市话号码-分机                          如:10-11111111-111,010-11111111-111 正则表达式:^0?([1-9]\d-\d{6,8}|[3-9][13579]\d-\d{6,7}|[3-9][24680]\d{2}-\d{6})(-\d{3})$ 区号<这里是相连的>市话                如:1011111111,01011111111 正则表达式:^0?([1-9]\d\d{6,8}|[3-9][13579]\d\d{6,7}|[3-9][24680]\d{2}\d{6})$ 所有格式:^((\+86)?|\+86\+86|\+86\s)0?([1-9]\d-?\d{6,8}|[3-9][13579]\d-?\d{6,7}|[3-9][24680]\d{2}-?\d{6})(-\d{3})?$ 分析:        手机号码:11位,以 1 开头,第二位是 3 或者 5。没考滤服务器的号码。        固定电话:总长10位,区号=10-4位,市话长度=10-N,可能还有3位分机号。开头的“0”不是区号部分,而是供长途直拔电话业务使用的字头。        手机: 国家代码+手机号        电话:国家代码+区号+电话号码 原邮电部对此有如下规定:(1)北京、天津等区号两位的城市市话号码长度不大于8位,因为市 话号码首位不能为1、0,最终容量可达八千万部。(2)各省会城市和大城市的区号三位,第一位选取“3、4、5、6、7、8、9”共七个数字,第二位选取单数“1、3、5、7、9”共五个数字,第三位随意。(3)各县城及小城市的区号四位,第一位选取“3、4、5、6、7、8、9”共七个数字,第二位选取双数“2、4、6、8、0”共五个数字,第三、四位随意。 匹配: 1334567890 031-3145678-123 010-11111111 (+86)010-13901691-123 不匹配: +861678901 (+89)07912140337 ------------------------------------------------------------------------                                日期的正则表达式 ------------------------------------------------------------------------ 分析:        中国式日期为“年-月-日”        年:1到任意在于1的整数,不能“0”开头。        月:1到12。        日:1、3、5、7、8、10、12月有31天;4、6、9、11月有30天,闰年2月份有29天,否则28天。        闰年的条件是符合下面二者之一:                (1)能被4整除,但不能被100整除。                (2)能被4整除,又能被400整除。//缩写为能被400整除。        #00格式(#代表任何数),只要#能被4整除,#00就一定能被400整除(闰年)。        非#00格式(也就不能被100整除了),能被4整除。 第一年的2月份都有28天,只要是闰年还要加一天。现在的任务是找出闰年。 100以内能被4整除的有: 00 04 08 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 他们的表达式为:(0?[048]|[2468][048]|[13579][26]) #00一定会被4整除,所以,只要#能被4整除,#00就一定能被400整除,他就是闰年。 #00格式闰年:(\d*(0?[048]|[2468][048]|[13579][26])00) 因为不能为#00格式,所以要从上面的表中删除00这个结果。 非#00格式闰年:(\d*(0?[48]|[2468][048]|[13579][26])) 把上面两个正则表达式合并 闰年:(\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26])) 整数01-28:(2[0-8]|[01]\d) 整数01-30:(30|[012]\d) 整数01-31:(3[01]|[012]\d) 整数1-28:(2[0-8]|1\d|[1-9]) 整数1-30:(30|[12]\d|[1-9]) 整数1-31:(3[01]|[12]\d|[1-9]) 把上面两组格式合并在一起: 整数1-28:(2[0-8]|1\d|0?[1-9]) 整数1-30:(30|[12]\d|0?[1-9]) 整数1-31:(3[01]|[12]\d|0?[1-9]) 现在我们把它们全部组合成中国“年-月-日”格式 ^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))-0?2-29)|[1−9]\d∗−((0?[13578]|10|12)−(3[01]|[12]\d|0?[1−9])|(0?[469]|11)−(30|[12]\d|0?[1−9])|(0?2)−(2[0−8]|1\d|0?[1−9]))|[1−9]\d∗−((0?[13578]|10|12)−(3[01]|[12]\d|0?[1−9])|(0?[469]|11)−(30|[12]\d|0?[1−9])|(0?2)−(2[0−8]|1\d|0?[1−9])) 匹配: 1-1-1 244-02-29 10-10-10 2000-2-29 2008-2-29 不匹配: 2009-2-29 2009-13-10 1005-12-65 中国“年/月/日”格式 ^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))\/0?2\/29)|[1−9]\d∗\/((0?[13578]|10|12)\/(3[01]|[12]\d|0?[1−9])|(0?[469]|11)\/(30|[12]\d|0?[1−9])|(0?2)\/(2[0−8]|1\d|0?[1−9]))|[1−9]\d∗\/((0?[13578]|10|12)\/(3[01]|[12]\d|0?[1−9])|(0?[469]|11)\/(30|[12]\d|0?[1−9])|(0?2)\/(2[0−8]|1\d|0?[1−9])) 匹配: 1/1/1 244/02/29 10/10/10 2000/2/29 2008/2/23 不匹配: 2009/2/29 2009/13/10 1005/12/65 中国“年.月.日”格式 ^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))\.0?2\.29)|[1−9]\d∗\.((0?[13578]|10|12)\.(3[01]|[12]\d|0?[1−9])|(0?[469]|11)\.(30|[12]\d|0?[1−9])|(0?2)\.(2[0−8]|1\d|0?[1−9]))|[1−9]\d∗\.((0?[13578]|10|12)\.(3[01]|[12]\d|0?[1−9])|(0?[469]|11)\.(30|[12]\d|0?[1−9])|(0?2)\.(2[0−8]|1\d|0?[1−9])) 匹配: 1.1.1 244.02.29 10.10.10 2000.2.29 2008.2.23 不匹配: 2009.2.29 2009.13.10 1005/12/65 中国“年/月/日”、“年-月-日”、“年.月.日”格式 (^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))-0?2-29)|[1−9]\d∗−((0?[13578]|10|12)−(3[01]|[12]\d|0?[1−9])|(0?[469]|11)−(30|[12]\d|0?[1−9])|(0?2)−(2[0−8]|1\d|0?[1−9]))|[1−9]\d∗−((0?[13578]|10|12)−(3[01]|[12]\d|0?[1−9])|(0?[469]|11)−(30|[12]\d|0?[1−9])|(0?2)−(2[0−8]|1\d|0?[1−9])))|(^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))\/0?2\/29)|[1−9]\d∗\/((0?[13578]|10|12)\/(3[01]|[12]\d|0?[1−9])|(0?[469]|11)\/(30|[12]\d|0?[1−9])|(0?2)\/(2[0−8]|1\d|0?[1−9]))|[1−9]\d∗\/((0?[13578]|10|12)\/(3[01]|[12]\d|0?[1−9])|(0?[469]|11)\/(30|[12]\d|0?[1−9])|(0?2)\/(2[0−8]|1\d|0?[1−9])))|(^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))\.0?2\.29)|[1−9]\d∗\.((0?[13578]|10|12)\.(3[01]|[12]\d|0?[1−9])|(0?[469]|11)\.(30|[12]\d|0?[1−9])|(0?2)\.(2[0−8]|1\d|0?[1−9]))|[1−9]\d∗\.((0?[13578]|10|12)\.(3[01]|[12]\d|0?[1−9])|(0?[469]|11)\.(30|[12]\d|0?[1−9])|(0?2)\.(2[0−8]|1\d|0?[1−9]))) 匹配: 1/1/1 244/02/29 10/10/10 2000/2/29 2008/2/29 244-02-29 10-10-10 2000-2-28 2008.2.29 不匹配: 1-1/1 2009/2/29 2009/13/10 1005/12/65 2009-2-29 2009-13-10 1005-12-65 中国“年月日”格式(用于身份证编码等),年由4位数表示,月2位,日2位 ^(((0[048]|[2468][048]|[13579][26])00|\d\d(0[48]|[2468][048]|[13579][26]))0229)|\d4((0[13578]|10|12)(3[01]|[12]\d|0[1−9])|(0[469]|11)(30|[12]\d|0[1−9])|02(2[0−8]|1\d|0[1−9]))|\d4((0[13578]|10|12)(3[01]|[12]\d|0[1−9])|(0[469]|11)(30|[12]\d|0[1−9])|02(2[0−8]|1\d|0[1−9])) 匹配: 19880329 20001220 20080229 不匹配: 1988329 20090229 20091310 10051265 欧美“月/日/年”格式 ^(0?2\/29\/(\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26])))|((0?[13578]|10|12)\/(3[01]|[12]\d|0?[1−9])|(0?[469]|11)\/(30|[12]\d|0?[1−9])|(0?2)\/(2[0−8]|1\d|0?[1−9]))\/[1−9]\d∗|((0?[13578]|10|12)\/(3[01]|[12]\d|0?[1−9])|(0?[469]|11)\/(30|[12]\d|0?[1−9])|(0?2)\/(2[0−8]|1\d|0?[1−9]))\/[1−9]\d∗ 匹配: 1/1/1 02/29/244 10/10/10 02/29/2000 2/29/2008 不匹配: 2/29/2009 13/10/2009 12/65/1005 ------------------------------------------------------------------------                                时间的正则表达式 ------------------------------------------------------------------------ 时间 正则表达式: ^([01]?\d|2[123]):([0-4]?\d|5\d)(:([0-4]?\d|5\d)(\.\d+|-?0\.\d*[1-9]\d*)? )?(am|AM|pm|PM)?$ 缺点: 分析:        时间格式:HH:mm:ss [am|pm|AM|PM]                               HH:mm [am|pm|AM|PM]        HH在0-23之间,mm在0-59之间,ss是大于等于0小于60的小数或整数。 匹配: 1:1:1 am 23:59:59.999 21:58 不匹配: 24:20:20 ------------------------------------------------------------------------                                身份证号码的正则表达式 ------------------------------------------------------------------------ 国内的身份证号码 正则表达式:(^\d{6}((0[48]|[2468][048]|[13579][26])0229|\d\d(0[13578]|10|12)(3[01]|[12]\d|0[1-9])|(0[469]|11)(30|[12]\d|0[1-9])|(02)(2[0-8]|1\d|0[1-9]))\d{3})|(\d6((2000|(19|21)(0[48]|[2468][048]|[13579][26]))0229|(((20|19)\d\d)|2100)(0[13578]|10|12)(3[01]|[12]\d|0[1−9])|(0[469]|11)(30|[12]\d|0[1−9])|(02)(2[0−8]|1\d|0[1−9]))\d3[\dX])|(\d6((2000|(19|21)(0[48]|[2468][048]|[13579][26]))0229|(((20|19)\d\d)|2100)(0[13578]|10|12)(3[01]|[12]\d|0[1−9])|(0[469]|11)(30|[12]\d|0[1−9])|(02)(2[0−8]|1\d|0[1−9]))\d3[\dX]) 一代身份证号码:^\d{6}((0[48]|[2468][048]|[13579][26])0229|\d\d(0[13578]|10|12)(3[01]|[12]\d|0[1-9])|(0[469]|11)(30|[12]\d|0[1-9])|(02)(2[0-8]|1\d|0[1-9]))\d{3}$ 二代身份证号码:^\d{6}((2000|(19|21)(0[48]|[2468][048]|[13579][26]))0229|(((20|19)\d\d)|2100)(0[13578]|10|12)(3[01]|[12]\d|0[1-9])|(0[469]|11)(30|[12]\d|0[1-9])|(02)(2[0-8]|1\d|0[1-9]))\d{3}[\dX]$ 测试环境:C++/.NET/JAVA/Javascript 属性:多行模式,大小写敏感 特点:不能验证二代身份证校验码位的正确性。 分析: 一代15位身份证号码:六位数字地址码,第7、8位为出生年份(两位数),第9、10位为出生月份,第11、12位代表出生日期,第15位代表性别,奇数为男,偶数为女。 二代18位身份证号码:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。         生日期码(身份证第七位到第十四位)表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。        顺序码(身份证第十五位到十七位)为同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性。         校验码(身份证最后一位)是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。  1984年8月30日我国颁发了第一批身份证(一代身份证),可由此 假设1.持有身份证的人中最老的在1900年出生。 假设2.一代身份证持有人在1900-2010年间出生。 假设3.二代身份证持有人在1900-2100年间出生。 1900-2100年间 闰年:(2000|(19|21)(0[48]|[2468][048]|[13579][26])) 平年:(19|21)(0?[1235679]|[2468][1235679]|[13579][01345789]) 匹配: 34052419800229001X 340524800229001 340524199001010013 不匹配: 34052419800101001a 21552418801010011 340524850229001 34052422800110081X 34052419800229001x!