我对这些不是很好。我无法弄清楚如何匹配这种情况:2012,2015(特定年份)2013-2015(年范围)2013- *(2013年之后的任何日期,即未来年份)。我可以让前两个场景匹配但不是最后一个。
/ ^ [0-9] {4}(?:[, - *] [0-9] {4})*,$ /
2012,2013,2014-2015, 2016 - * (不匹配)
答案 0 :(得分:0)
您可以用逗号分隔并逐个查看年份:
let s = "2012,2013,2014-2015,2016-*,foo,292992,322,2103-238";
let split = s.split(',');
for (let x of split) {
console.log(determine(x));
}
// or to check if all are ok:
let allOk = split.every(determine);
console.log("every: ", allOk);
function determine(year) {
let y = year.split('-');
if (!y[0].match(/^\d{4}$/)) return false;
if (typeof y[1] === 'undefined' || y[1] === '*') return true;
return determine(y[1]);
}

答案 1 :(得分:0)
答案 2 :(得分:0)
以下是如何处理整件事。由于逗号不能是可选的,如果您有更多年份并且您不想以逗号结尾,则必须重复年份:
^[0-9]{4}(?:-(?:[0-9]{4}|\*))?(?:,[0-9]{4}(?:-(?:[0-9]{4}|\*))?)*$