我目前使用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();
}
((((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]))))
都有效。但截至目前,只接受了第一个测试用例。
你能帮忙吗?
答案 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]'可能有所帮助。