0

0

C++如何实现字符串的模糊搜索?(基于通配符或正则)

冰火之心

冰火之心

发布时间:2026-02-24 17:03:28

|

415人浏览过

|

来源于php中文网

原创

std::regex模糊匹配需确认编译器版本(msvc 19.28+/gcc 10+/clang 10+),避免老版本静默降级;注意字符串字面量反斜杠双写、ecmascript模式限制、全匹配/子串匹配区别、性能优化(缓存regex)、通配符场景优先手写双指针算法,路径匹配用generic_string(),模式固定选ctre,动态则考虑pcre2。

c++如何实现字符串的模糊搜索?(基于通配符或正则)

std::regex 做正则模糊匹配,但得先确认编译器支持

MSVC 19.28+、GCC 10+、Clang 10+ 才完整支持 std::regex 的 ECMAScript 模式;老版本(如 GCC 9)会静默降级或抛 std::regex_error。别等运行时报错才怀疑——编译期加个测试:

static_assert(std::regex_constants::ECMAScript != 0, "regex not supported");

常见错误现象:std::regex_match("abc", std::regex("a.*c")) 返回 false,其实是忘了字符串字面量里反斜杠要双写:"a.*c" 没问题,但 "a\.*c" 才匹配字面点号。正则里 . 默认匹配任意字符,不是通配符意义上的“任意长度任意字符”。

  • 想匹配文件名模式(如 "*.log"),别直接塞进 std::regex —— 先转义:std::string pattern = std::regex_replace(user_input, std::regex("\*"), ".*");
  • std::regex_search 查子串,std::regex_match 要全匹配,别混用
  • 性能敏感场景慎用:每次构造 std::regex 对象有开销,重复使用请缓存 std::regex 实例

手写通配符匹配(*?)比正则更轻量也更可控

如果只需要 *(匹配任意长度)和 ?(匹配单字符),自己写个双指针算法,50 行内搞定,零依赖、无异常、可 constexpr(C++20)。它比 std::regex 快一个数量级,尤其短字符串高频匹配时。

关键逻辑:遇到 * 就记下当前通配符位置和字符串位置,往后贪心匹配;不匹配就回退,让 * 多吃一个字符。容易踩的坑:

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

Paraflow
Paraflow

AI产品设计智能体

下载
  • "a*b" 匹配 "ab" ✅,但 "a**b""a*b*c" 要归一化,否则可能栈溢出或死循环
  • 空字符串 "" 只能被 "*""" 匹配,"?" 不行
  • 区分大小写:默认区分,如需忽略,预处理时统一转小写,别在匹配循环里反复调 std::tolower

跨平台路径匹配别碰 std::filesystem::path::filename() 直接比较

Windows 路径分隔符是 '\',Linux 是 '/',而 std::filesystem::path 内部会 normalize,但 filename() 返回的 string_type 在不同平台类型不同(Windows 是 wstring)。直接拿 filename().string() 去喂 std::regex,在 MinGW 或某些 MSVC 配置下会触发编码转换失败。

正确做法:先转为通用格式再匹配:

auto name = p.filename().generic_string(); // 返回 std::string,含 '/' 分隔符
if (wildcard_match(name, "*.cpp")) { ... }
  • 不要用 p.stem() + p.extension() 拼接判断,stem() 会砍掉最后一个点后的部分,"config.test.json"stem()"config.test",不是你想要的通配意图
  • 路径中含 Unicode(如中文文件名)时,generic_string() 在 UTF-8 环境下安全;Windows 上若用窄字符编译,确保控制台/终端也设为 UTF-8(SetConsoleOutputCP(65001)

第三方库选 ctre 还是 PCRE2?看构建约束

ctre(Compile-Time Regular Expressions)把正则编译到模板实例里,匹配极快,但要求模式必须是字面量("^\d{3}-\d{2}-\d{4}$"),不能来自用户输入;PCRE2 动态编译、功能全、兼容 Perl,但得链接额外库、Windows 下需手动处理 DLL。

选型依据很实际:

  • 你的模式是否固定?是 → 用 ctre::search(s),编译时检查语法,运行零开销
  • 需要捕获组且模式动态?→ 接入 PCRE2,但注意 pcre2_compile() 可能返回 NULL,必须判空
  • 项目禁用 CMake 外部依赖?那 ctre 单头文件友好,PCRE2 需预编译或子模块管理

通配符看似简单,但路径、编码、编译器差异、动态输入这四点叠在一起,很容易在某个客户环境突然失效。最稳的路是:确定只要 */? 就手写;要正则且模式固定就上 ctre;其余情况,先测好目标平台的 std::regex 行为再说。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

448

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

323

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

246

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

866

2024.03.01

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

246

2023.09.22

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

1

2026.02.24

热门下载

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

精品课程

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

共94课时 | 10.1万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 19.2万人学习

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

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