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

NestJs中匹配特定规则字符串的正则表达式问题求助

NestJs @Matches正则匹配解决方案:限制开头为字母/数字且仅含指定符号

直接上能满足需求的正则表达式,配合@Matches装饰器使用:

import { IsString, Matches } from 'class-validator';

export class YourDto {
  @IsString()
  @Matches(/^[a-zA-Z0-9][a-zA-Z0-9\-_']*$/, {
    message: '输入内容必须以字母或数字开头,仅可包含字母、数字、-、_、\'字符',
  })
  targetField: string;
}

正则规则拆解

  • ^:锁定字符串起始位置,确保开头必须符合规则
  • [a-zA-Z0-9]:强制第一个字符是字母或数字,直接拦截-foo、_foo、'foo这类以符号开头的内容
  • [a-zA-Z0-9\-_']*:允许后续字符为字母、数字、-、_、',*表示可以有0个或多个(支持单个字母/数字的场景,比如foo)
  • $:锁定字符串结束位置,确保整个内容没有超出规则的字符(比如URL里的:、/、.都会被拦截)

之前正则失效的常见原因

  1. 未强制开头规则:比如用了\w(\w包含_),会允许_foo通过;或者直接用[a-zA-Z0-9\-_']+,没限制开头,导致符号开头的内容漏过
  2. 转义错误:-在正则字符集里如果不在首尾,需要转义成\-,否则会被解析为范围(比如a-z),导致规则不符合预期

验证结果

  • ✅ 允许通过:foo、foo_、foo-、foo'
  • ❌ 被拦截:https://google.com、-foo、_foo、'foo、$foo

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 08:37:04