合法的 snake_case 字符串只含小写字母、数字和下划线,且首字符不能是数字或下划线,末字符不能是下划线,不含连续下划线;如 user_id 合法,而 userid、_user、user__id、123name 均不合法。

什么是合法的 snake_case 字符串
snake_case 要求字符串只含小写字母、数字和下划线,且不能以数字或下划线开头,也不能以下划线结尾,还不能出现连续下划线。比如 user_id 合法,UserID、_user、user__id、123name 都不合法。
用 std::all_of + 自定义谓词快速校验
最直接的方式是遍历每个字符,检查是否属于允许集合,并额外处理首尾和连续下划线逻辑。别用正则——C++ 标准库正则在某些编译器(如 MinGW)上性能差、兼容性弱,且过度杀伤。
实操建议:
- 先判空:
s.empty()直接返回false - 检查首字符:
!std::islower(s[0]) && !std::isdigit(s[0])→ 不合法 - 检查末字符:
s.back() == '_'→ 不合法 - 遍历中间字符:对每个
c,要求std::islower(c) || std::isdigit(c) || c == '_' - 同步检测连续下划线:遇到
'_'时,检查前一个字符是否也是'_'
注意 std::islower 的 locale 陷阱
默认 C locale 下,std::islower 只对 ASCII 小写字母返回 true;如果传入非 ASCII 字符(如带重音的 é),行为未定义,可能崩溃或误判。实际项目中若需支持 Unicode,应先转为 ASCII 等价形式,或改用 ICU 库;但纯 snake_case 场景本就不该含 Unicode,所以更稳妥的做法是显式限定范围:
auto is_valid_char = [](char c) {
return (c >= 'a' && c = '0' && c <p>这样避免 locale 依赖,也比 <code>std::islower</code> 更快、更确定。</p><h3>要不要允许数字开头?多数规范不允许</h3><p>PEP 8(Python)、Rust 的 snake_case 规范、Google C++ Style Guide 都明确禁止数字开头,因为容易与数字字面量混淆(如 <code>2d_array</code> 可能被误读为 <code>2 * d_array</code>)。即使你的代码生成器暂时宽松,也建议严格拒绝 <code>std::isdigit(s[0])</code> 的情况。</p><p>容易被忽略的一点:下划线不能连续出现,但单个下划线可以出现在任意非首尾位置——这个约束必须显式循环检查,无法靠字符集判断绕过。</p>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











