java java日期正则表达式式 匹配[00:00.00]或者[00:00]这两种歌词时间格式的java日期正则表达式式

史上最详细的js日期正则表达式分享
字体:[ ] 类型:转载 时间:
最近项目经常要用到日期的正则表达式,就上度娘查了下,整理出来,分享给大家
最简单的正则 如 : /d{4}-/d{2}-/d{2}但是实际情况却不是那么简单,,要考虑,有效性和闰年等问题.....
对于日期的有效范围,不同的应用场景会有所不同。MSDN中定义的DateTime对象的有效范围是: 00:00:00到 23:59:59。
UNIX时间戳的0按照ISO 8601规范为 :T00:00:00Z。
先考虑与年份无关的前三条规则,年份可统一写作
下面仅考虑月和日的正则
1. 包括平年在内的所有年份的月份都包含1-28日
(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])
2. 包括平年在内的所有年份除2月外都包含29和30日
(0[13-9]|1[0-2])-(29|30)
3. 包括平年在内的所有年份1、3、5、7、8、10、12月都包含31日
(0[1])-31)
合起来就是除闰年的2月29日外的其它所有日期
(?!]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[1])-31)
接下来考虑闰年的实现
1 : 四年一闰([0-9]{2}(0[48]|[]|[13579][26])
2 : 百年不闰,四百年再闰(0[48]|[]|[1
3 : 合起来就是所有闰年的2月29日([0-9]{2}(0[48]|[]|[13579][26])|(0[48]|[]|[1)-02-29)
四条规则都已实现,且互相间没有影响,合起来就是所有符合DateTime范围的日期的正则
^((?!]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[1])-31)|([0-9]{2}(0[48]|[]|[13579][26])|(0[48]|[]|[1)-02-29)$
考虑到这个正则表达式仅仅是用作验证,所以捕获组没有意义,只会占用资源,影响匹配效率,所以可以使用非捕获组来进行优化。
^(?:(?!]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[1])-31)|(?:[0-9]{2}(?:0[48]|[]|[13579][26])|(?:0[48]|[]|[1)-02-29)$ 分类: JavaScript
& js 日期正则表达式支持月日验证 这款js 日期正则表达式支持月日验证,我们会一一举例说明一下有关日期验证表达式的函数实例了.
function isdate(str){ var result=str.match(/^(d{4})(-|/)(d{1,2})2(d{1,2})$/); if(result==null) var d=new Date(result[1], result[3]-1, result[4]); return (d.getFullYear()==result[1] && d.getMonth()+1==result[3] && d.getDate()==result[4]); }
检查是否为 YYYY-MM-DD || YYYY/MM/DD 的日期格式
面仅考虑月和日的正则
1. 包括平年在内的所有年份的月份都包含1-28日
(0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])2. 包括平年在内的所有年份除2月外都包含29和30日
(0[13-9]|1[0-2])-(29|30)3. 包括平年在内的所有年份1、3、5、7、8、10、12月都包含31日
(0[1])-31)合起来就是除闰年的2月29日外的其它所有日期
(?!]{4}-((0[1-9]|1[0-2])-(0[1-9]|1[0-9]|2[0-8])|(0[13-9]|1[0-2])-(29|30)|(0[1])-31)function isdatetime(str) { var result=str.match(/^(d{4})(-|/)(d{1,2})2(d{1,2}) (d{1,2}):(d{1,2}):(d{1,2})$/); if(result==null) var d= new Date(result[1], result[3]-1, result[4], result[5], result[6], result[7]); return (d.getFullYear()==result[1]&&(d.getMonth()+1)==result[3]&&d.getDate()==result[4]&&d.getHours()==result[5]&&d.getMinutes()==result[6]&&d.getSeconds()==result[7]); }
// 判断输入是否是有效的长日期格式 - "YYYY-MM-DD HH:MM:SS" || "YYYY/MM/DD HH:MM:SS"
这是yyyy-mm-dd hh:mm:ss 的
/^(d{4})-(d{2})-(d{2}) (d{2}):(d{2}):(d{2})$/ ;
这是 yyyy-mm-ddde 的
/^(d{4})-(d{2})-(d{2})$/
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具正则表达式,只匹配1或2。_百度知道求日期验证的正则表达式,可以匹配yyyy-MM-dd 和 yyyy-M-d格式的_百度知道2547人阅读
JAVA(23)
Oracle数据库(18)
public class DateCheck&&&
&&&& * 正则表达式验证日期格式&
&&&& * @param args&
public static void main(String[] args)&&&
&&&&&&& String checkValue = &&;&&&
&&&&&&& //String eL = &^((((1[6-9]|[2-9]\\d)\\d{2})-(0?[1])-(0?[1-9]|[12]\\d|3[01]))|(((1[6-9]|[2-9]\\d)\\d{2})-(0?[[012])-(0?[1-9]|[12]\\d|30))|(((1[6-9]|[2-9]\\d)\\d{2})-0?2-(0?[1-9]|1\\d|2[0-8]))|(((1[6-9]|[2-9]\\d)(0[48]|[]|[13579][26])|((16|[]|[))-0?2-29-))
(20|21|22|23|[0-1]?\\d):[0-5]?\\d:[0-5]?\\d$&;&&&
&&&&&&&&&&&
&&&&&&& String eL= &^((]))))))&;&&&
&&&&&&& Pattern p = pile(eL);&&&&
&&&&&&& Matcher m = p.matcher(checkValue);&&&&
&&&&&&& boolean b = m.matches();&&&
&&&&&&& if(b)&&&
&&&&&&& {&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&& System.out.println(&格式正确&);&&&
&&&&&&& }&&&
&&&&&&& else&
&&&&&&& {&&&
&&&&&&&&&&& System.out.println(&格式错误&);&&&
&&&&&&& }&&&
&&& }&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
一、简单的日期判断(YYYY/MM/DD):&
^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$&&&
^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$&
二、演化的日期判断(YYYY/MM/DD| YY/MM/DD):&
^(^(\d{4}|\d{2})(\-|\/|\.)\d{1,2}\3\d{1,2}$)|(^\d{4}年\d{1,2}月\d{1,2}日$)$&&&
^(^(\d{4}|\d{2})(\-|\/|\.)\d{1,2}\3\d{1,2}$)|(^\d{4}年\d{1,2}月\d{1,2}日$)$&
三、加入闰年的判断的:&
&&&&&&&&&&&
^((((1[6-9]|[2-9]\d)\d{2})-(0?[1])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[]|[13579][26])|((16|[]|[))-0?2-29-))$&&
^((((1[6-9]|[2-9]\d)\d{2})-(0?[1])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[]|[13579][26])|((16|[]|[))-0?2-29-))$
1、什么是合法的日期范围?对于不同的应用场景,这个问题有不同的解释。这里采纳MSDN中的约定:&
&&&&&&&&&&& DateTime值类型表示值范围在公元(基督纪元)0001 年 1 月 1 日午夜 12:00:00 到公元 (C.E.) 9999 年 12 月 31 日晚上 11:59:59 之间的日期和时间。&
2、关于闰年的阐释。&
&&&&& 关于公历闰年是这样规定的:地球绕太阳公转一周叫做一回归年,一回归年长365日5时48分 46秒。因此,公历规定有平年和闰年,平年一年有365日,比回归年短0.2422日,四年共短0.9688日,故每四年增加一日,这一年有366日,就是闰年。但四年增加一日比四个回归年又多0.0312日,400年后将多3.12日,故在400年中少设3个闰年,也就是在400年中只设97个闰年,这样公历年的平均长度与回归年就相近似了。由此规定:年份是整百数的必须是400的倍数才是闰年,例如1900年、2100年就不是闰年。&
首先需要验证年份,显然,年份范围为 0001 - 9999,匹配YYYY的正则表达式为:&
[0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}&&
[0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}
其中 [0-9] 也可以表示为 \d,但 \d 不如 [0-9] 直观,因此下面我将一直采用 [0-9]&
用正则表达式验证日期的难点有二:一是大小月份的天数不同,二是闰年的考虑。&
对于第一个难点,我们首先不考虑闰年,假设2月份都是28天,这样,月份和日期可以分成三种情况:&
1、月份为 1, 3, 5, 7, 8, 10, 12,天数范围为 01 - 31,匹配MM-DD的正则表达式为:&
(0[1])-(0[1-9]|[12][0-9]|3[01])&&&
(0[1])-(0[1-9]|[12][0-9]|3[01])&
2、月份为 4, 6, 9, 11,天数范围为 01-30,匹配MM-DD的正则表达式为:&
(0[469]|11)-(0[1-9]|[12][0-9]|30)&&&
(0[469]|11)-(0[1-9]|[12][0-9]|30)&
3、月份为 2,考虑平年情况,匹配MM-DD的正则表达式为:&
02-(0[1-9]|[1][0-9]|2[0-8])&&
02-(0[1-9]|[1][0-9]|2[0-8])
根据上面的成果,我们可以得到匹配平年日期格式为YYYY-MM-DD的正则表达式:&
([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[1])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))&&&
([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[1])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))&
接着我们来解决第二个难点:闰年的考虑。根据闰年的定义,我们可以将闰年分为两类:&
1、能被4整除但不能被100整除的年份。寻找后两位的变化规律,可以很快得到下面的正则匹配:&
([0-9]{2})(0[48]|[]|[13579][26])&&&
([0-9]{2})(0[48]|[]|[13579][26])&
2、能被400整除的年份。能被400整除的数肯定能被100整除,因此后两位肯定是00,我们只要保证前两位能被4整除即可,相应的正则表达式为:&
(0[48]|[]|[&&&
(0[48]|[]|[&
2.最强验证日期的正则表达式,添加了闰年的验证&
这个日期正则表达式支持&
YYYY-MM-DD&
YYYY/MM/DD&
YYYY_MM_DD&
YYYY.MM.DD的形式&
not match : && &
完整的正则表达式如下:&
((^((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])$)|(^([)([-\/\._])(0?2)([-\/\._])(29)$)|(^([)([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][13579][26])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)$))&&&
((^((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])$)|(^([)([-\/\._])(0?2)([-\/\._])(29)$)|(^([)([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][0][48])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][])([-\/\._])(0?2)([-\/\._])(29)$)|(^([1][89][13579][26])([-\/\._])(0?2)([-\/\._])(29)$)|(^([2-9][0-9][13579][26])([-\/\._])(0?2)([-\/\._])(29)$))&
闰年的2月份有29天,因此匹配闰年日期格式为YYYY-MM-DD的正则表达式为:&
(([0-9]{2})(0[48]|[]|[13579][26])|((0[48]|[]|[))-02-29最后,将平年和闰年的日期验证表达式合并,我们得到最终的验证日期格式为YYYY-MM-DD的正则表达式为:&
(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[1])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[]|[13579][26])|((0[48]|[]|[))-02-29)&&&
(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[1])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[]|[13579][26])|((0[48]|[]|[))-02-29)&
DD/MM/YYYY格式的正则验证表达式为:&
(((0[1-9]|[12][0-9]|3[01])/((0[1]))|((0[1-9]|[12][0-9]|30)/(0[469]|11))|(0[1-9]|[1][0-9]|2[0-8])/(02))/([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}))|(29/02/(([0-9]{2})(0[48]|[]|[13579][26])|((0[48]|[]|[)))
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:61912次
积分:1080
积分:1080
排名:千里之外
原创:42篇
转载:12篇
评论:15条
(1)(5)(1)(35)(12)Java(12)
今天使用正则表达式是遇到一个问题, 磨了半天, 发现犯了个低级错误, 因此记录下来加深印象
问题描述:&
我需要把&^drawable(-[a-zA-Z0-9]+)*$ &和 &^mipmap(-[a-zA-Z0-9]+)*$ 这两个正则表达式用或的关系连接起来
我尝试了一下方法都未成功!!
pile(&^drawable(-[a-zA-Z0-9]+)*$ | ^mipmap(-[a-zA-Z0-9]+)*$&)
pile(&(^drawable(-[a-zA-Z0-9]+)*$) | (^mipmap(-[a-zA-Z0-9]+)*$)&)
pile(&^drawable(-[a-zA-Z0-9]+)* | mipmap(-[a-zA-Z0-9]+)*$&)
pile(&^(drawable | mipmap)(-[a-zA-Z0-9]+)*$&)
import java.util.regex.Pattern;
public class MyClass {
public static Pattern VALID_FOLDER_PATTERN = Pattern.compile(&^drawable(-[a-zA-Z0-9]+)*$ | ^mipmap(-[a-zA-Z0-9]+)*$&);
//public static Pattern VALID_FOLDER_PATTERN = pile(&(^drawable(-[a-zA-Z0-9]+)*$) | (^mipmap(-[a-zA-Z0-9]+)*$)&);
//public static Pattern VALID_FOLDER_PATTERN = pile(&^drawable(-[a-zA-Z0-9]+)* | mipmap(-[a-zA-Z0-9]+)*$&);
//public static Pattern VALID_FOLDER_PATTERN = pile(&^(drawable | mipmap)(-[a-zA-Z0-9]+)*$&);
public static void main(String[] args) {
if(VALID_FOLDER_PATTERN.matcher(&drawable-xhdpi&).matches()) {
System.out.println(&match&);
System.out.println(&no match&);
if(VALID_FOLDER_PATTERN.matcher(&mipmap-xhdpi&).matches()) {
System.out.println(&match&);
System.out.println(&no match&);
纠结了半天发现自己画蛇添足地把逻辑符号或(|) 的左右添加了一个空格(可能是写代码习惯了-_-!!)
去掉作用两边的空格, 其实上面四个正则表达式都是正确的
总结: &在用逻辑符或连接正则表达式时, 千万不要为了好看而在左右添加空格!! (其他符号也是一样! 如^、$、*、.........不一而足...)
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:13580次
排名:千里之外
原创:31篇
转载:23篇
(3)(3)(10)(2)(6)(5)(1)(12)(11)

我要回帖

更多关于 java日期正则表达式 的文章

 

随机推荐