正则表达式:在可变日期格式

时间:2016-01-23 15:20:31

标签: regex

我有以下输入

8_Evening-2010_Day4-UpTempo-NA_26-September-10_Item1

8_Evening-2010_Day4-UpTempo-NA_26-Sept-10_Item1

8_Evening-2010_Day4-UpTempo-NA_2-May-10_Item1

8_Evening-2010_Day4-UpTempo-NA-26-May-10_Item1

599_Evening_Ano-Jula-Saga_11_Jul-09_Item1

553_Sing-and-Other-Clips_Feb-09

以下表达式:

/.*(?:-|_)(\d{1,2}|)(?:-|_)(?i)([a-zA-Z]{3,4}|january|february|march|april|may|june|july|august|september)|october|november|december)(?-i)-(\d\d).*/

但是我无法得到最后的结果,这应该只是09年2月。有没有人知道如何让日期可选?

我也是正则表达式的新手。如果有人建议改进正则表达式,请随意。

Click here for the demo

1 个答案:

答案 0 :(得分:1)

我建议做这样的事情:

(?i)(?:-|_)(?:(\d{1,2})(?:-|_))?([a-z]{3,4}|january|february|march|april|may|june|july|august|september|october|november|december)-(\d{2})

基本上我修改了这些要点:

  • 添加新的可选不匹配组并将第一个匹配组包含在那里
  • 使整个模式不区分大小写而不仅仅是它的一部分(这里没有多大意义)

修改

以下是PHP中的上述示例:

$input = array();
$input[] = "8_Evening-2010_Day4-UpTempo-NA_26-September-10_Item1";
$input[] = "8_Evening-2010_Day4-UpTempo-NA_26-Sept-10_Item1";
$input[] = "8_Evening-2010_Day4-UpTempo-NA_2-May-10_Item1";
$input[] = "8_Evening-2010_Day4-UpTempo-NA-26-May-10_Item1";
$input[] = "599_Evening_Ano-Jula-Saga_11_Jul-09_Item1";
$input[] = "553_Sing-and-Other-Clips_Feb-09";

$pattern = "/(?i)(?:-|_)(?:(\d{1,2})(?:-|_))?([a-z]{3,4}|january|february|march|april|may|june|july|august|september|october|november|december)-(\d{2})/";

foreach ($input as $string) {
        $matches = array();
        preg_match($pattern, $string, $matches);
        print_r($matches);
}

根据preg_match的文档,[0]的第一个元素($matches)将包含整个匹配项。以下三个元素将代表各个匹配组。由于没有可用的日期,因此不会为最后一个示例设置$matches[1]