从日期字符串中提取日期(1或2位数),月份(1或2位数)和年份(2或4位数)(针对不同模式)

时间:2015-10-08 04:30:58

标签: javascript regex

我的应用有一个文本字段,用户可以手动输入日期。此外,我的应用程序有首选项选择日期模式,如M D Y或D M Y或Y M D.

1)假设,app目前正在使用M D Y模式。因此,用户可以使用以下格式输入日期: 2015年9月14日或2015年9月14日或2015年9月14日或2015年9月14日或2015年9月14日

这里我要提取......

month => 09 (or 9)
day => 14
year => 2015 (or 15)

注意:由于应用程序使用的是M D Y模式,如果用户以D M Y模式(如14/09/2015)或Y M Y模式(如2015/09/14)输入日期,我们就不应该匹配它。

我有以下正则表达式

var dateString = "09/14/2015";
var match = dateString.match(/(\d{1,2})[\/ \.-](\d{1,2})[\/ \.-](\d{2,4}).*/);

但它不符合我的期望,因为它也允许D M Y和Y M Y模式。

2)同样地,如果app正在使用D M Y模式,我想提取日,月和年。 (它不应该允许M D Y或Y M D)

3)同样地,如果app正在使用Y M D模式,我想提取年,月和日。 (它不应该允许M D Y或D M Y)

有人可以帮我解决吗?谢谢!

3 个答案:

答案 0 :(得分:1)

试试这个

^((0?[13578]|10|12)(-|\/)(([1-9])|(0[1-9])|([12])([0-9]?)|(3[01]?))(-|\/)((19)([2-9])(\d{1})|(20)([01])(\d{1})|([8901])(\d{1}))|(0?[2469]|11)(-|\/)(([1-9])|(0[1-9])|([12])([0-9]?)|(3[0]?))(-|\/)((19)([2-9])(\d{1})|(20)([01])(\d{1})|([8901])(\d{1})))$

答案 1 :(得分:1)

不幸的是,仅使用正则表达式无法提供问题的完整答案。它们旨在识别模式。在几种情况下,通过识别模式,可以告诉该模式代表有效数据。但这并不总是正确的,你的问题就是一个例子。

想一想:“15-02-29”有效吗? 答案是:这取决于! 这个单字符串可以表示:

  • 15 / feb / 2029 - 有效;
  • ?? / 2nd / 2029 - 无效;
  • 2015 / feb / 29 - 无效,因为2015年不是闰年;
  • ......等等。

所以这超出了正则表达式的意图。他们只是愚蠢的字符串识别器。 解决方案?您甚至可以使用正则表达式从传递的字符串中提取值,但是您必须编写一些额外的代码来验证这些值的含义。

答案 2 :(得分:0)

2015年5月6日的日期可能意味着" 2015年6月5日"或" 2015年5月6日"无论哪种方式,日期都是有效的,并且对MDY和DMY都有效,因此它们不能互相排斥。一旦用户选择了一种格式,你就必须信任它以使其正确。(在某些情况下)

查看javascript库moment.js 您可以使用它按预期格式解析字符串日期。

moment("9/14/2015", ["MM-DD-YYYY", "YYYY MM DD", "DD-MM-YYYY"]);

我设置了一个小游乐场:http://jsfiddle.net/me2loveit2/knfjepty/