正则表达日期,匹配今年月份加上去年12月和明年1月

时间:2014-06-29 17:26:44

标签: regex date

您好我正在尝试编写一个与此标准符合字符串中所有月份名称的正则表达式:

  • 如果字符串只包含月份名称而不是有效的
  • 如果字符串包含月份名称并以年份开始/结束,那么年份必须是当前年份,但它也必须与去年12月和明年1月份相匹配

通过示例:

june - valid
june 2014 - valid
2014 june - valid
june 2013 - invalid
june 2015 - invalid

december - valid
december 2013 - valid
december 2015 - invalid

january - valid
january 2015 - valid
january 2013 - invalid

我使用以下正则表达式:

^(?:2014\s*|2015\s*(january)|2014\s*(december)|)(january|february|march|april|may|june|july|august|september|october|november|december|)(?:\s*2014|(december)\s*?2013|(january)\s*?2015|)?$

但是当我尝试 2015年1月

时,它会给我“”
array(6) {
  [0]=>
  string(11) "january 2015"
  [1]=>
  string(0) ""
  [2]=>
  string(0) ""
  [3]=>
  string(0) ""
  [4]=>
  string(0) ""
  [5]=>
  string(6) "january"
}

或者如果我尝试 2015年1月

array(4) {
  [0]=>
  string(11) "2015 january"
  [1]=>
  string(6) "january"
  [2]=>
  string(0) ""
  [3]=>
  string(0) ""
}

所以我必须忽略所有空值并找到正确的值

你们可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

您尚未撰写要应用正则表达式的语言。

但是,如果正则表达式搜索字符串包含多个标记组,您将始终返回多个字符串,其中大多数字符串为空。

或许可以根据您的要求用一个正则表达式来获得月份,但我不知道如何。

我的建议如下:

首先,在字符串上应用以下正则表达式:

^(?:2014)?[\t ]*(january|february|march|april|may|june|july|august|september|october|november|december)[\t ]*(?:2014)?$

如果此正则表达式返回月份字符串,则完成任务。

但是如果没有返回字符串,则必须对字符串执行第二个正则表达式:

^(?:2015)?[\t ]*(january)[\t ]*(?:2015)?$

如果此正则表达式返回字符串january,则完成任务。

但如果再次没有返回字符串,则必须对字符串执行第三个正则表达式:

^(?:2013)?[\t ]*(december)[\t ]*(?:2013)?$

如果此正则表达式返回字符串december,则完成任务。

否则,所有3个正则表达式搜索都返回false,因此没有月份,评估的字符串不包含有效的月份信息。

这个具有多达3个正则表达式搜索的解决方案肯定比具有单个非常复杂的正则表达式搜索字符串的解决方案更快。

答案 1 :(得分:0)

第一次匹配年份和月份使用类似的东西((jan | feb | ...)都是月份名称):

/(\d{4})?(jan|feb|...)(\d{4})?/i

然后,如果每个案例的文本匹配,请进行验证。 (php中的脚本)

if($match[1]=="")
  $year=intval($match[3]);
else
  $year=intval($match[1]);
if($year==$currentYear-1){
  //month($match[2]) should be jan or dec
}else if($year==$currentYear){
  //month could be everything
}else{
  //invalid year
}