是否有一个现有的解决方案来动态创建超出给定日期时间格式模式的正则表达式?支持的日期时间格式模式无关紧要(Joda DateTimeFormat,java.text.SimpleDateTimeFormat或其他)。日期时间格式的动态正则表达式
即对于给定的日期时间格式(例如“dd/MM/yyyy hh:mm”),它将生成相应的正则表达式以匹配指定格式内的日期时间。
是否有一个现有的解决方案来动态创建超出给定日期时间格式模式的正则表达式?支持的日期时间格式模式无关紧要(Joda DateTimeFormat,java.text.SimpleDateTimeFormat或其他)。日期时间格式的动态正则表达式
即对于给定的日期时间格式(例如“dd/MM/yyyy hh:mm”),它将生成相应的正则表达式以匹配指定格式内的日期时间。
我想你有你的时间格式可以构造有限字母表。这意味着,"HH"
在24小时制时间内总是“小时”,"dd"
总是在前一天为零的那一天,依此类推。
由于时间格式的顺序特性,您可以尝试将"dd/mm/yyyy HH:nn"
的格式字符串标记为数组["dd", "/", "mm", "/", "yyyy", " ", "HH", ":", "nn"]
。然后继续并通过用"([01][0-9]|2[0-3])"
等替换"HH"
来从该阵列形成模式字符串。将这些模式原子预构建到查找表/数组中。数组中所有不在查找表中的部分都是文字。按照正则表达式规则将它们转义并将它们追加到模式字符串中。
编辑:作为一个基于正则表达式的解决方案的副作用,当你把你的查找表的所有正则表达式的“原子”到括号,并跟踪他们的订单在给定的格式字符串,你将能够使用子匹配从匹配中提取所需的组件,并将它们提供给CreateDate函数,从而完全跳过ParseDate部分。
SimpleDateFormat
已经用parse()
方法做了这个。
如果您需要从单个字符串解析多个日期,请以正则表达式开始(即使它的匹配过于宽松),并在由正则表达式找到的所有潜在匹配上使用parse()
。
如果您正在寻找基本的日期检查。此代码与此数据匹配。
\b(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}\b
10/07/2008
10.07.2008
1-01/2008
10/07/08
10.07.2008
1-01/08
代码通过使用RegexBuddy
如下JS /动态jQuery代码生成日期格式,而不适用日期时间正则表达式(开发版本尚未完全测试。)
日期格式应为“d M Y”
如。
DD-MM-YY,
DD-MM-YYYY,
YYYY-MM-DD,
YYYY-DD-MM,
MM-DD-YYYY,
MM-DD-YY,
DD/MM/YY ,
DD/MM/YYYY,
YYYY/MM/DD,
YYYY/DD/MM,
MM/DD/YYYY,
MM/DD/YY
或其它格式,但使用[DMY]字符创建
var dateFormat = "DD-MM-YYYY";
var order = [];
var position = {"D":dateFormat.search('D'),"M":dateFormat.search('M'),"Y":dateFormat.search('Y')};
var count = {"D":dateFormat.split("D").length - 1,"M":dateFormat.split("M").length - 1,"Y":dateFormat.split("Y").length - 1};
var seprator ='';
for(var i=0; i<dateFormat.length; i++){
if(["Y","M","D"].indexOf(dateFormat.charAt(i))<0){
seprator = dateFormat.charAt(i);
}else{
if(order.indexOf(dateFormat.charAt(i)) <0){
order.push(dateFormat.charAt(i));
}
}
}
var regEx = "^";
$(order).each(function(ok,ov){
regEx += '(\d{'+count[ov]+'})'+seprator;
});
regEx = regEx.substr(0,(regEx.length)-1);
regEx +="$";
var re = new RegExp(regEx);
console.log(re);
注 - 没有月/日的验证检查 例如。月应在01-12或日期应在01-31
它只解析给定的文本是否匹配模式并返回该字符串的Date对象表示形式。它不会解析日期信息是否在其他文本中。 like“sometext 12/03/2004 some text。 – hakan 2008-09-09 15:33:46
这可能是不可判定的。如果文本包含两个日期,例如”在A和B之间,等等,其中A和B是日期...... – 2008-09-09 16:12:59
好吧,那么会发现它们作为两个组,就像一个正则表达式发现 – hakan 2008-09-11 07:44:18