如何使用Zod实现多正则表达式的数据验证?
Zod多正则验证问题解决方案
首先看你代码里的两个明显问题:
- 变量名大小写错误:
RegexThree应该是regexThree,这会直接导致引用错误,验证自然失败。 - 链式调用逻辑错误:
z.string().toUpperCase().union([z.regex(...)])的写法逻辑不对,你是想先把输入转成大写,再验证是否匹配任意一个正则,但这里的union是把「转大写的字符串」和「三个正则规则」做合并,而非让转大写后的字符串满足任意一个正则。
下面给两种可行的解决方法:
方法一:使用refine自定义验证(推荐)
这种方式逻辑更清晰,直接对转大写后的字符串做任意正则匹配的检查:
const regexOne = /你的正则规则/i; // 加i标志可忽略大小写,或者直接写匹配大写的规则 const regexTwo = /你的正则规则/i; const regexThree = /你的正则规则/i; const Schema = z.object({ validation: z.string() .toUpperCase() .refine(val => regexOne.test(val) || regexTwo.test(val) || regexThree.test(val), { message: "输入不符合指定格式要求" }) });
方法二:修正union的写法
如果坚持用union,需要让每个分支都先完成转大写再应用正则规则,同时修正变量名:
const regexOne = /匹配大写的正则规则/; const regexTwo = /匹配大写的正则规则/; const regexThree = /匹配大写的正则规则/; const Schema = z.object({ validation: z.union([ z.string().toUpperCase().regex(regexOne), z.string().toUpperCase().regex(regexTwo), z.string().toUpperCase().regex(regexThree) ]) });
额外注意点
- 如果你的原始正则是匹配小写的,要么给正则加
i标志忽略大小写,要么把正则改成匹配大写的模式,因为toUpperCase()会把输入转成全大写,小写正则会匹配失败。 - 拆分独立Schema的话,也要遵循同样的逻辑:每个独立Schema都要包含
toUpperCase()和对应的正则,再把这些Schema做union。
内容的提问来源于stack exchange,提问作者Gabriel Almeida
相关产品推荐
相关产品推荐

