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

C++ regex_search匹配日文及含连字符正则失败问题求助

问题原因分析

一、日文正则匹配失败的原因

你使用的\b是ASCII单词边界,C++标准库的std::regex默认采用ECMAScript正则语法,其中\b仅识别ASCII范围内的单词字符(a-z、A-Z、0-9、下划线_)与非单词字符之间的边界。

日文汉字不属于ASCII单词字符范畴,所以\b料監査\b中的两个\b都无法匹配:

  • 字符串开头的料是日文(非ASCII单词字符),和字符串起始位置之间不满足\b的匹配条件;
  • 料監査末尾的査和后面的.(非单词字符)之间,因为査不是ASCII单词字符,同样不触发\b匹配。

如果要匹配日文的边界,要么去掉\b,要么改用Unicode单词边界(部分编译器/库支持,比如添加std::regex::unicode标志,但需注意兼容性),或者用正向/反向断言来定位边界。

二、含连字符正则匹配结果不一致的原因

同样是\b的规则导致的:\b匹配的是单词字符与非单词字符的转换位置,连字符-属于非单词字符。

看你的正则\bAENL- Int'l Passport-\b,重点看末尾的Passport-\b:

  1. fileName1:AENL- Int'l Passport- Sample.docx
    -后面是空格(非单词字符),两个非单词字符之间没有边界转换,所以\b不匹配,导致整个正则匹配失败。
  2. fileName2:AENL- Int'l Passport-Sample.docx
    -后面是S(ASCII单词字符),非单词字符→单词字符的转换恰好满足\b的匹配条件,所以整个正则匹配成功。
  3. fileName3:AENL- Int'l Passport-.docx
    -后面是.(非单词字符),同样是两个非单词字符之间,没有边界转换,\b不匹配,正则失败。

如果要匹配所有包含AENL- Int'l Passport-的字符串,去掉末尾的\b即可,或者根据实际需求用断言替代\b。


内容的提问来源于stack exchange,提问作者Suraj Singla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 00:37:46