【问题标题】:Regex for date, match this year months plus december of previous year and january of next year日期的正则表达式,匹配今年的月份加上去年的 12 月和明年的 1 月
【发布时间】:2014-08-20 03:19:08
【问题描述】:

您好,我正在尝试编写一个正则表达式,该表达式将通过此标准匹配字符串中的所有月份名称:

  • 如果字符串只包含月份名称而不是有效的
  • 如果字符串包含月份名称并以年份开头/结尾,则年份必须是当前年份,但还必须与上一年的 12 月和明年的 1 月匹配

通过示例:

六月 - 有效 2014 年 6 月 - 有效 2014 年 6 月 - 有效 2013 年 6 月 - 无效 2015 年 6 月 - 无效 十二月 - 有效 2013 年 12 月 - 有效 2015 年 12 月 - 无效 一月 - 有效 2015 年 1 月 - 有效 2013 年 1 月 - 无效

我使用以下正则表达式:

^(?: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) ""
}

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

你们能帮忙吗?

【问题讨论】:

  • 也许这是个坏建议,但我会考虑使用strtotime 来获取时间戳。

标签: regex date


【解决方案1】:

您还没有编写要应用正则表达式的语言。

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

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

我的建议如下:

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

^(?: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 或 2 个以上,那么简单的正则表达式搜索比运行一个非常复杂的单个正则表达式搜索要快,后者需要内部大量的转发和正则表达式引擎在搜索字符串中的向后定位。
  • 嗨,我已经测试了你的答案,我得到了以下结果我已经运行了 10 次测试,使用 6 个不同的字符串我的执行时间:0.00076436996459961 建议执行时间:0.0011527538299561 用 PHP 编写跨度>
【解决方案2】:

第一次匹配年份和月份,使用类似这样的内容((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
}

【讨论】:

    猜你喜欢
    • 2019-09-27
    • 2015-12-25
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    相关资源
    最近更新 更多