从日期字符串中提取日期(1或2位数)、月(1或2位数)和年(2或4位数)(用于不同的模式)

Extract date(1 or 2 digit), month(1 or 2 digit) and year(2 or 4 digit) from a date string (for different pattern)

本文关键字:2位数 用于 4位数 模式 和年 提取 取日期 日期 字符串      更新时间:2023-09-26

我的应用程序有一个文本字段,用户可以手动输入日期。此外,我的应用程序有偏好选择日期模式,如年月日或年月日或年月日

1)假设应用程序当前使用的是M D Y模式。因此,用户可以输入以下格式的日期:09/14/2015或9/14/2015或09/14/15或9-14-2015或9-14/2015

这里我想提取…

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

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

我有下面的regex

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)以同样的方式,如果应用程序使用D M Y模式,我想提取日,月和年。(它不应该允许M D Y或Y M D)

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

有人能帮我修一下吗?谢谢你!

Try This

^((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})))$

不幸的是,仅通过使用正则表达式无法为您的问题提供完整的答案。它们是用来识别模式的。在一些情况下,仅仅通过识别模式就可以判断该模式是否表示有效数据。但这并不总是正确的,你的问题就是一个例子。

想一想:"15-02-29"是有效的吗?答案是:视情况而定!这个字符串可以表示:

  • 2029年2月15日生效;
  • ? ?/2/2029 -无效;
  • 2015/feb/29 -无效,因为2015不是闰年;

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

日期06/05/2015可以表示"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/