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



你好,我试图写一个正则表达式,将匹配所有的月份名称在这个条件下的字符串:

  • 如果字符串只包含月份名,那么它是有效的
  • 如果字符串包含月份名称并且以year开始/结束,那么year必须是当前年份,但也必须匹配上一年的12月和明年的1月
通过例子:

<>之前6月-有效2014年6月-有效2014年6月-有效2013年6月-无效2015年6月-无效12月-有效2013年12月-有效2015年12月-无效1月-有效2015年1月-有效2013年1月-无效之前

我使用以下正则表达式:

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

但是当我尝试january 2015

时,它给了我"作为结果
array(6) {
  [0]=>
  string(11) "january 2015"
  [1]=>
  string(0) ""
  [2]=>
  string(0) ""
  [3]=>
  string(0) ""
  [4]=>
  string(0) ""
  [5]=>
  string(6) "january"
}

或者如果我尝试2015 january

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

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

你们能帮忙吗?

您没有指定要应用正则表达式的语言。

但是,如果regex搜索字符串包含多个标记组,您将始终获得多个返回字符串,其中大多数字符串为空。

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

我的建议如下:

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

^(?: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个regex搜索都返回false,因此没有月份,计算的字符串不包含有效的月份信息。

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

第一个匹配年份和月份的方法是这样的((jan|feb|…)都是月份的名称):

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

如果文本匹配,则执行验证。(script in 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
}

最新更新