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:
- fileName1:
AENL- Int'l Passport- Sample.docx-后面是空格(非单词字符),两个非单词字符之间没有边界转换,所以\b不匹配,导致整个正则匹配失败。 - fileName2:
AENL- Int'l Passport-Sample.docx-后面是S(ASCII单词字符),非单词字符→单词字符的转换恰好满足\b的匹配条件,所以整个正则匹配成功。 - fileName3:
AENL- Int'l Passport-.docx-后面是.(非单词字符),同样是两个非单词字符之间,没有边界转换,\b不匹配,正则失败。
如果要匹配所有包含AENL- Int'l Passport-的字符串,去掉末尾的\b即可,或者根据实际需求用断言替代\b。
内容的提问来源于stack exchange,提问作者Suraj Singla
相关产品推荐
相关产品推荐

