0

0

c++中如何实现字符串的大小写不敏感比较_c++忽略大小写匹配【实例】

穿越時空

穿越時空

发布时间:2026-01-23 18:01:02

|

109人浏览过

|

来源于php中文网

原创

c++kquote>最稳妥的忽略大小写字符串比较方式是先判断长度是否相等,再用 std::equal 配合 std::tolower(参数转为 unsigned char)逐字符比较,避免未定义行为和 locale 依赖。

c++中如何实现字符串的大小写不敏感比较_c++忽略大小写匹配【实例】

std::equal 配合 std::tolower 实现安全比较

直接用 std::string::compare== 比较字符串默认区分大小写,C++ 标准库没有内置的忽略大小写比较函数。最稳妥的方式是逐字符转换后比对,避免依赖区域设置(locale)导致的意外行为。

  • std::equal 支持自定义二元谓词,适合做逐字符比较
  • 必须对两个字符串都调用 std::tolower,且传入 unsigned char 类型,否则遇到负值 char(如 UTF-8 高字节)会触发未定义行为
  • 先判断长度是否相等,不等直接返回 false,避免 std::equal 越界
bool iequals(const std::string& a, const std::string& b) {
    if (a.length() != b.length()) return false;
    return std::equal(a.begin(), a.end(), b.begin(),
        [](unsigned char c1, unsigned char c2) {
            return std::tolower(c1) == std::tolower(c2);
        }
    );
}

std::localestd::use_facet 做 locale-aware 比较

如果需要支持带重音符号的字母(如 éÉ),或适配多语言环境(比如德语中 ß 等价于 ss),就得借助 std::locale。但注意:标准 C++ 的 std::toupper/std::tolower 在默认 locale 下并不处理这类映射,需显式指定 locale(如 "en_US.UTF-8"),且平台支持程度不一。

  • Linux/macOS 通常支持 POSIX locale 名称;Windows 的 MSVC 对 locale 名称支持有限,常用 ""(空字符串)表示系统 locale
  • 使用 std::use_facet<:ctype>> 更可靠,它封装了 locale-specific 的大小写转换逻辑
  • 性能比纯 ASCII 方案低,每次转换都要查表,不适合高频调用场景
bool iequals_locale(const std::string& a, const std::string& b, const std::locale& loc = std::locale("")) {
    if (a.length() != b.length()) return false;
    auto& fct = std::use_facet>(loc);
    return std::equal(a.begin(), a.end(), b.begin(),
        [&fct](char c1, char c2) {
            return fct.tolower(c1) == fct.tolower(c2);
        }
    );
}

避免用 std::transform + 临时字符串的低效方案

常见误区是先将两个字符串全转成小写再比较:std::transform 复制一份新字符串,既浪费内存又拖慢速度。尤其在比较长字符串或频繁调用时(如哈希表查找、配置项匹配),这种做法会成为瓶颈。

Figstack
Figstack

一个基于 Web 的AI代码伴侣工具,可以帮助跨不同编程语言管理和解释代码。

下载
  • 临时字符串分配 + 构造 + 析构,开销明显高于就地比较
  • 如果只用于一次判断(如 if (to_lower(s) == "quit")),可接受;但封装成通用函数时应避免
  • 某些实现中 std::transform 还可能触发多次内存重分配(取决于 string 的 capacity 策略)

正则表达式匹配时如何忽略大小写

当需求是「在文本中查找忽略大小写的子串」而非单纯相等判断,std::regex 是更合适的选择。但要注意:C++11 的 std::regex 在各编译器上实现质量差异大,GCC 的 libstdc++ 长期不支持 icase 标志,Clang/libc++ 支持较好。

立即学习C++免费学习笔记(深入)”;

  • 使用 std::regex_constants::icase 标志,例如:std::regex re("hello", std::regex_constants::icase)
  • 匹配整个字符串需加锚点:^hello$,否则默认是子串匹配
  • 若仅需简单子串查找(非正则逻辑),优先用 std::search 配合自定义谓词,比正则快一个数量级
bool contains_icase(const std::string& text, const std::string& pattern) {
    if (pattern.empty()) return true;
    auto it = std::search(text.begin(), text.end(), pattern.begin(), pattern.end(),
        [](unsigned char c1, unsigned char c2) {
            return std::tolower(c1) == std::tolower(c2);
        }
    );
    return it != text.end();
}
实际项目里,90% 的“忽略大小写比较”场景都是 ASCII 英文标识符(如协议字段、配置键、命令名),用第一种 std::equal + std::tolower 方案最轻量也最可控。真正需要 locale-aware 行为时,务必在目标平台实测,别只看文档。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

510

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

250

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

742

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

213

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

351

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

234

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

528

2023.12.06

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

9

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.6万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号