【问题标题】:Regex Date Format Validation正则表达式日期格式验证
【发布时间】:2016-02-29 15:55:23
【问题描述】:

我在使用正则表达式来验证我的日期格式(即 dd/mm/yyyy)时遇到问题。

基本上我构建客户端 Javascript 来检查后面代码中的数据格式,如下所示

public static string CalendarJS()
{
  string sCalendarJS = string.Empty;
  sCalendarJS = "<script type=\"text/javascript\">" +
             "function checkDate(){" +
             "var sDate = document.getElementById(\"ddlDays\").value;" +
             "var sMonth = document.getElementById(\"ddlMonth\").value;" +
             "var sYear = document.getElementById(\"ddlYear\").value;" +
             "var cDate = sDate + \"/\" + sMonth + \"/\" + sYear;" +
             "validatedate(cDate);" +
             "}" +
             "function validatedate(input){" +
             "var validformat= '^\\d{2}\\/\\d{2}\\/\\d{4}$';" +                  
             "var returnval=false;" +
             "if (!validformat.test(input.value))" +
             "alert(\"Invalid Date Format. Please correct and submit again.\");" +
             "else{" +
             "var monthfield=input.value.split(\"/\")[0];" +
             "var dayfield=input.value.split(\"/\")[1];" +
             "var yearfield=input.value.split(\"/\")[2];" +
             "var dayobj = new Date(yearfield, monthfield-1, dayfield);" +
             "if ((dayobj.getMonth()+1!=monthfield)||(dayobj.getDate()!=dayfield)||(dayobj.getFullYear()!=yearfield))" +
             "alert(\"Invalid Day, Month, or Year range detected. Please correct and submit again.\");" +
             "else" +
             "returnval=true;" +
             "}" +
             "if (returnval=false) input.select();" +                 
             "return returnval;" +                 
             "}" +
             "</script>";

  return sCalendarJS;
 }

我通过传入日期参数​​来调用提交按钮的点击事件的上述方法,例如2016 年 1 月 1 日。

但是它似乎在“无效的日期格式”上失败了。日期验证的正则表达式是 ^\d{2}/\d{2}/\d{4}$ 并且我在这里测试了正则表达式 http://www.regular-expressions.info/javascriptexample.html 并且它通过了。 但是,不确定我是否通过它更正?

我不得不在正则表达式中添加额外的反斜杠,因为它抱怨表达式中的“无法识别的转义序列”。我不确定这是否是解决此问题的正确方法?

解决方案 我删除了日期格式验证的正则表达式,因为我已经为日、月和年字段设置了下拉列表。所以这些都不是输入的,因此在我设置格式时不需要验证。唯一需要做的就是检查给定月份的闰年和日期范围。

无论如何它并没有解决正则表达式的问题,但确实为其他检查提供了解决方案

string sCalendarJS = string.Empty;
sCalendarJS = @"<script type='text/javascript'>
                function checkDate(){
                    var sDate = document.getElementById('ddlDays').value;
                    var sMonth = document.getElementById('ddlMonth').value;
                    var sYear = document.getElementById('ddlYear').value;
                    var cDate = sMonth + '/' + sDate + '/' + sYear;
                    if (validatedate(cDate) == true) return true;                                            
                }
                function validatedate(input){
                     var returnval=false;
                     var monthfield=input.split('/')[0];                         
                     var dayfield=input.split('/')[1];
                     var yearfield=input.split('/')[2];                         
                     var dayobj = new Date(yearfield, monthfield-1,     dayfield);                         
                     if ((dayobj.getMonth()+1!=monthfield)||(dayobj.getDate()!=dayfield)||(dayobj.getFullYear()!=yearfield))
                         alert('Invalid Day, Month, or Year range detected. Please correct and submit again.');                             
                     else
                         returnval=true;                                                                              
                     return returnval;                         
                    }
              </script>";

希望这有帮助吗?

【问题讨论】:

  • "var validformat= '^\\d{2}\\/\\d{2}\\/\\d{4}$';" --> "var validformat= /^\d{2}\/\d{2}\/\d{4}$/;"。请检查此更改后是否有效。
  • 嗨,Wiktor,该建议不起作用,因为它抱怨在 OP 中提到的 /^\d 之后无法识别的转义序列。
  • 是的,因为您需要使用逐字字符串文字来声明它。好吧,只是将'^\\d{2}\\/\\d{2}\\/\\d{4}$'; 更改为/^\\d{2}\\/\\d{2}\\/\\d{4}$/; 将无济于事。您在此 JS 代码中有很多问题。喜欢elsereturnval=true;。我建议你应该取出这个 JS 函数,在jsfiddle.net 使用它来检查你的示例输入,修复,然后重新格式化为你的 C# 方法的字符串。
  • 感谢 Wiktor 的建议。如果有帮助,我从这里javascriptkit.com/script/script2/validatedate.shtml 得到了原始 JS?以自然形式工作正常。

标签: javascript c# regex


【解决方案1】:

两件事:(1) C# 使用原始字符串文字,通过在它前面加上 @ 前缀(不记得是哪个版本的)。 (2) Javascript 允许单引号和双引号作为字符串分隔符。使用单引号避免不得不从 C# 中转义。

试试这个:

sCalendarJS = @"<script type='text/javascript'>
    function checkDate(){
        var sDate = document.getElementById('ddlDays').value;
        var sMonth = document.getElementById('ddlMonth').value;
        var sYear = document.getElementById('ddlYear').value;
        var cDate = sDate + '/' + sMonth + '/' + sYear;
        validatedate(cDate);
    }
    function validatedate(input){
        var validformat= '^\\d{2}\\/\\d{2}\\/\\d{4}$';
        var returnval=false;
        if (!validformat.test(input.value))
            alert('Invalid Date Format. Please correct and submit again.');
        else {
            var monthfield=input.value.split('/')[0];
            var dayfield=input.value.split('/')[1];
            var yearfield=input.value.split('/')[2];
            var dayobj = new Date(yearfield, monthfield-1, dayfield);
            if ((dayobj.getMonth()+1!=monthfield)||(dayobj.getDate()!=dayfield)||(dayobj.getFullYear()!=yearfield))
                alert('Invalid Day, Month, or Year range detected. Please correct and submit again.');
            else
                returnval=true;
        }
        if (returnval=false) input.select();
            return returnval;
        }
        </script>";

【讨论】:

  • 仅供参考:原始字符串文字实际上称为逐字字符串文字
  • 感谢 Code Different 的解决方案,但是,它仍然无法通过正则表达式验证。它以无效的日期格式返回。我什至将正则表达式更改为 var validformat= /^\d{2}\/\d{2}\/\d{4}$/; 仍然无法验证?
  • 好的,我通过删除日期格式验证解决了这个问题,因为用户必须通过下拉列表选择日、月和年,所以不需要它。唯一需要做的就是检查闰年并验证日期范围。在上面发布解决方案。但是,这并不能解决正则表达式问题。
猜你喜欢
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
相关资源
最近更新 更多