我的应用有一个文本字段,用户可以手动输入日期。此外,我的应用程序有首选项选择日期模式,如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)
有人可以帮我解决吗?谢谢!
答案 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”有效吗? 答案是:这取决于! 这个单字符串可以表示:
所以这超出了正则表达式的意图。他们只是愚蠢的字符串识别器。 解决方案?您甚至可以使用正则表达式从传递的字符串中提取值,但是您必须编写一些额外的代码来验证这些值的含义。
答案 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/