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

Django正则验证求助:单词首字母大写或全大写规则实现

修复Django正则验证:仅允许单词首字母大写或全大写

看起来你的正则表达式没精准匹配到每个单词的规则,咱们一步步拆解问题并修复它:

原正则的核心问题

你的原始正则有两个关键缺陷,导致无法正确过滤非法输入:

  1. 第一个分支 (^[A-Z][\sa-z0-9]+$) 限制了整个字符串只能以大写字母开头,后续只能是空格、小写字母或数字——这意味着除了第一个单词,其他单词的首字母都不能大写(比如合法输入里的"The GOOD day"中的"GOOD"会被这个分支直接拒绝),完全不符合你要的「每个单词独立验证」的需求。
  2. 第二个分支 (^([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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:07:47