You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular自定义验证器开发求助:HHH:MM格式小时输入的正则验证(小时范围0-70、分钟范围00-59)

解决Angular自定义验证器的HHH:MM格式验证问题

没问题,我帮你调整正则表达式和验证器逻辑,完美适配你要的0-70小时、00-59分钟的6字符格式要求。

第一步:编写精准的正则表达式

咱们需要严格匹配HHH:MM格式,其中HHH是带前导零的3位小时数(000-070),MM是两位分钟数(00-59)。对应的正则表达式如下:

public static HHMM_VALID = /^(0[0-6]\d|070):[0-5]\d$/;

拆解一下这个正则的逻辑:

  • ^ 和 $:确保整个输入字符串完全匹配,避免出现部分符合的情况(比如前面多字符)
  • 0[0-6]\d:匹配000到069的3位小时数(覆盖0-69小时的带前导零输入)
  • 070:单独匹配70小时的合法输入(070)
  • :[0-5]\d:匹配冒号加上00-59的两位分钟数

第二步:修正自定义验证器函数

你原来的验证器有几个小问题:参数类型不对、逻辑判断反了、不必要的isNaN判断。我帮你调整成更简洁准确的版本:

import { AbstractControl, ValidatorFn } from '@angular/forms';

export class RegexConstants {
  // 替换原来的DECIMAL_6_4,用新的验证正则
  public static HHMM_VALID = /^(0[0-6]\d|070):[0-5]\d$/;
}

export function hoursClaimedValidator(reg: RegExp): ValidatorFn {
  return (control: AbstractControl): { [key: string]: boolean } | null => {
    // 如果控件为空,直接通过验证(如果需要必填验证可以单独加Validators.required)
    if (!control.value) {
      return null;
    }
    // 把值转成字符串,验证是否匹配正则
    const valueStr = control.value.toString().trim();
    if (!reg.test(valueStr)) {
      // 不匹配则返回错误标记
      return { 'hoursClaimed': true };
    }
    // 匹配通过,返回null表示验证成功
    return null;
  };
}

第三步:在表单中使用验证器

你可以像这样在FormControl里添加这个验证器:

import { FormControl, Validators } from '@angular/forms';
import { hoursClaimedValidator, RegexConstants } from './your-validator-path';

// 示例:创建带验证的表单控件
const hoursControl = new FormControl('', [
  Validators.required, // 如果需要必填的话
  hoursClaimedValidator(RegexConstants.HHMM_VALID)
]);

这样调整后,就能准确验证输入是否符合030:15这种格式,同时确保小时在0-70之间、分钟在00-59之间啦。

内容的提问来源于stack exchange,提问作者snowflakes74

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 07:27:38