正则表达式以DD.MM格式验证日期

时间:2016-09-28 19:15:57

标签: python regex

我已经搜索了很多正则表达式来验证DD.MM.YYYY格式的日期。像这样:

+0+0

它工作正常。

据我所知,(0[1-9]|1[0-9]|2[0-8]|(?:29|30)(?!.02)|29(?=.02.\d\d(?:[02468][048]|[13579][26]))|31(?=.0[13578]|.1[02]))(?:\.(?=\d\d\.)|-(?=\d\d-)|\/(?=\d\d\/))(0[1-9]|1[0-2])[.\/\-]([1-9][0-9]{3})部分是指年份。我尝试删除它并开始验证以点结尾的日期,例如([1-9][0-9]{3})01.05.等。

10.07.

但是当我删除处理点/破折号分隔符的部分时

>>> regex = '^(0[1-9]|1[0-9]|2[0-8]|(?:29|30)(?!.02)|29(?=.02.\d\d(?:[02468][048]|[13579][26]))|31(?=.0[13578]|.1[02]))(?:\.(?=\d\d\.)|-(?=\d\d-)|\/(?=\d\d\/))(0[1-9]|1[0-2])[.\/\-]$'
>>> aaa = '12.02.'
>>> bbb = '32.02.'
>>> print(re.match(regex, aaa))
<_sre.SRE_Match object; span=(0, 6), match='12.02.'>
>>> print(re.match(regex, bbb))
None

它不会在没有尾随点的情况下验证日期:

[.\/\-]

我如何使这项工作?

关于2月28日/ 2月29日的更新:

如果它在2月28日29日没有通过,那没关系,这在我的情况下是可以接受的。

关于PYTHON的更新:

我不能对此使用python验证,遗憾的是它只是我可以使用的Web表单中的正则表达式字段。

2 个答案:

答案 0 :(得分:0)

解决方案

 ^(0[1-9]|[12][0-9]|30(?!\.02)|31(?!\.(0[2469]|11)))\.(0[1-9]|1[0-2])$

python中的示例

>>> daymonth_match = r"^(0[1-9]|[12][0-9]|30(?!\.02)|31(?!\.(0[2469]|11)))\.(0[1-9]|1[0-2])$"
>>> print re.match(daymonth_match, "12.04")
<_sre.SRE_Match object at 0x7f3728125880>
>>> print re.match(daymonth_match, "29.02")
<_sre.SRE_Match object at 0x7f3728125880>
>>> print re.match(daymonth_match, "30.02")
None
>>> print re.match(daymonth_match, "30.04")
<_sre.SRE_Match object at 0x7f3728125880>
>>> print re.match(daymonth_match, "31.04")
None
>>> print re.match(daymonth_match, "31.05")
<_sre.SRE_Match object at 0x7f3728125880>

假设29.02始终有效。

有关其工作原理的一些细节

此正则表达式依赖于负向前瞻断言(?!...)。 例如,表达式30(?!\.02)表示30仅在\.02 AND后面是匹配时才会匹配,因为它是“向前看”,\.02不被视为作为表达式本身的匹配(有关详细信息,请参阅python documentation

答案 1 :(得分:0)

只需点和年可选:

$query = "SELECT * FROM blogs ORDER BY date DESC";
$resultSet = mysql_query($query);

if (mysql_num_rows($resultSet)){
$newsArray = array();

echo '<ul>' . PHP_EOL;                                           

while ($newsResult = mysql_fetch_array($resultSet)){ 
    $newDate =  $newsResult['date'] ;   
    $timePeriod = date('F  Y ',strtotime($newDate));
    $timePeriodY = date('Y',strtotime($timePeriod));
    $timePeriodM = date('F',strtotime($timePeriod));                                          


    $newsArray[$timePeriodY][$timePeriod][] = $newsResult;                                      
}                                         

//by year
foreach ($newsArray as $timePeriodY => $newsItems){
    echo '<li><strong>' . $timePeriodY . '</strong>' . PHP_EOL;  
    echo '<ul>' . PHP_EOL;

    //by month
    foreach ($newsItems as $timePeriod => $items){
        echo '<li><strong>' . $timePeriod . '</strong>' . PHP_EOL;  
        echo '<ul>' . PHP_EOL;                                

        //news items
        foreach ($items as $item){
            echo '<li>';
            echo '<a href="'.$wwwUrl.'press-releases/'.$item["id"].'/'.$item["titlename"].'.php">'.$item["titlename"].'</a>';
            echo '</li>' . PHP_EOL;
        }     

        //end by month
        echo '</ul>' . PHP_EOL; 
        echo '</li>' . PHP_EOL;                   
    }

    //end by year
    echo '</ul>' . PHP_EOL; 
    echo '</li>' . PHP_EOL;                   
}

echo '<li>&nbsp;</li>' . PHP_EOL;   
echo '</ul>' . PHP_EOL; 
} else {
echo 'No Blog Found';
}