1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| static validate(expression) { const parts = expression.trim().split(/\s+/);
if (parts.length !== 5 && parts.length !== 6) { return { valid: false, error: 'Cron 表达式必须包含5个或6个字段' }; }
const fieldValidators = [ this.validateSeconds, this.validateMinutes, this.validateHours, this.validateDayOfMonth, this.validateMonth, this.validateDayOfWeek ];
const startIndex = parts.length === 5 ? 1 : 0;
for (let i = startIndex; i < parts.length; i++) { const validator = fieldValidators[i]; const validationResult = validator(parts[i]);
if (!validationResult.valid) { return { valid: false, error: `字段 ${i - startIndex + 1} (${this.getFieldName(i - startIndex)}): ${validationResult.error}` }; } }
return { valid: true }; }
static validateField(field, min, max) { if (field === '*') return { valid: true }; if (field === '?') return { valid: true };
for (const value of values) { if (value.includes('-')) { if (rangeParts.length !== 2) { return { valid: false, error: `无效的范围格式: ${value}` }; }
const start = parseInt(rangeParts[0]); const end = parseInt(rangeParts[1]);
if (isNaN(start) || isNaN(end) || start < min || end > max || start > end) { return { valid: false, error: `范围超出界限: ${value} (范围: ${min}-${max})` }; } } else if (value.includes('/')) { if (intervalParts.length !== 2) { return { valid: false, error: `无效的间隔格式: ${value}` }; }
const divisor = parseInt(intervalParts[1]); if (isNaN(divisor) || divisor <= 0) { return { valid: false, error: `无效的间隔值: ${value}` }; } } else { if (isNaN(num) || num < min || num > max) { return { valid: false, error: `值超出界限: ${num} (范围: ${min}-${max})` }; } } }
return { valid: true }; }
static validateSeconds(field) { return this.validateField(field, 0, 59); } static validateMinutes(field) { return this.validateField(field, 0, 59); } static validateHours(field) { return this.validateField(field, 0, 23); } static validateDayOfMonth(field) { return this.validateField(field, 1, 31); } static validateMonth(field) { return this.validateField(field, 1, 12); } static validateDayOfWeek(field) { return this.validateField(field, 0, 7); }
static getFieldName(index) { const names = ['秒', '分钟', '小时', '日期', '月份', '星期']; return names[index] || '未知'; } }
console.log(CronValidator.validate('0 0 25 * *'));
|