Django正则验证求助:单词首字母大写或全大写规则实现
修复Django正则验证:仅允许单词首字母大写或全大写
看起来你的正则表达式没精准匹配到每个单词的规则,咱们一步步拆解问题并修复它:
原正则的核心问题
你的原始正则有两个关键缺陷,导致无法正确过滤非法输入:
- 第一个分支
(^[A-Z][\sa-z0-9]+$)限制了整个字符串只能以大写字母开头,后续只能是空格、小写字母或数字——这意味着除了第一个单词,其他单词的首字母都不能大写(比如合法输入里的"The GOOD day"中的"GOOD"会被这个分支直接拒绝),完全不符合你要的「每个单词独立验证」的需求。 - 第二个分支
(^([A-Z]\w*\s*)+$)里的\w*包含大写字母,所以像"ThIS"这种混合大小写的单词会被误判为合法——它只检查了首字母大写,对后续字符没有任何大小写限制。
修正后的正则验证代码
我们需要针对每个单词单独制定规则:每个单词要么是「首字母大写+后续小写/数字」,要么是「全大写/全数字」,然后整个字符串由这些单词和空格组成。
修正后的代码如下:
RegexValidator( regex=r'^(([A-Z][a-z0-9]+)|([A-Z0-9]+))(\s+(([A-Z][a-z0-9]+)|([A-Z0-9]+)))*$', message='Capital Letters are allowed only as first word letter or only if all letters in word are uppercase', code='invalid_capitalisation' )
正则规则拆解
咱们把这个正则的逻辑拆解开看:
^和$:匹配整个字符串的开头和结尾,确保没有额外的非法字符混入([A-Z][a-z0-9]+):匹配「首字母大写,后续为小写字母或数字」的单词(比如"This"、"Day123")([A-Z0-9]+):匹配「全大写字母或全数字」的单词(比如"GOOD"、"1234")(([A-Z][a-z0-9]+)|([A-Z0-9]+)):组合上述两种合法单词的情况(\s+(([A-Z][a-z0-9]+)|([A-Z0-9]+)))*:允许后续跟着一个或多个空格,再接合法单词,重复0次或多次(支持多单词的场景)
测试验证
- 合法输入「This is The GOOD day」:完全匹配规则,会顺利通过验证
- 非法输入「ThIS is THE gOOD day」:"ThIS"和"gOOD"不符合两种合法单词的规则,会被正确拦截
简化版本(可选)
如果你的场景不需要支持数字,还可以去掉正则里的0-9部分,简化成:
RegexValidator( regex=r'^(([A-Z][a-z]+)|([A-Z]+))(\s+(([A-Z][a-z]+)|([A-Z]+)))*$', message='Capital Letters are allowed only as first word letter or only if all letters in word are uppercase', code='invalid_capitalisation' )
内容的提问来源于stack exchange,提问作者Shubham Singh Kalyanwat
相关产品推荐
相关产品推荐

