日期验证正则表达式 - 使前导零可选

时间:2017-01-16 10:19:59

标签: javascript regex

我目前使用http://regexlib.com的以下正则表达式使用模式YYYY-MM-DD验证传入日期。但是前导零是强制性的,我希望它是可选的。

    @Override
    public void onBackPressed() {
        Fragment currentFragment = getSupportFragmentManager().getFragments().get(getSupportFragmentManager().getBackStackEntryCount() - 1);
        if (currentFragment instanceof OnBackPressed) {
            ((OnBackPressed) currentFragment).onBackPressed();
           return;
        }
        super.onBackPressed();
    }

Regular expression visualization

Debuggex Demo

Test case

((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8]))))

都有效。但截至目前,只接受了第一个测试用例。

你能帮忙吗?

3 个答案:

答案 0 :(得分:1)

使用函数而不是正则表达式可以更简单地实现这一点。以下是更容易理解和维护(尽管它不应该需要任何),并且是OP中正则表达式的代码少得多。

function isValidISODate(s) {
  var b = s.split(/\D/);
  var d = new Date(b[0],--b[1],b[2]);
  return d && d.getMonth() == b[1];
}

// Some tests
['2016-1-1','2016-01-01','2016-2-29','2016-02-30'].forEach(
   s=>console.log(s + ': ' + isValidISODate(s))
);

答案 1 :(得分:0)

您可以通过添加允许的次数{0,1}来使数字可选。那是{1,2}接受1个字符或2个。

简单版本:

[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}

修改:您的版本很容易修复"。只需在强制0后添加{0,1}

// Before.
((((0[13578]
// After.
((((0{0,1}[13578]

编辑2:正如@Toto所说{0,1}?相同

((((0?[13578]

答案 2 :(得分:0)

使用此正则表达式 - ' \ d + - [0-2] * [0-9] - [0-3] * [0-9]'可能有所帮助。