C语言基于regex实现不区分大小写字符串匹配的问题及解决
问题出在哪
你之前改完出现误匹配,核心是两个认知偏差:
- C语言没有JS/Python那种模板字符串的替换能力,你写在
regcomp参数字符串引号里的[inputName]是完完全全的固定文本,不会自动把用户输入存在inputName数组里的内容替换进去。你写的"[a-zA-Z][inputName]"这个正则的实际匹配逻辑是:先匹配1个任意大小写英文字符,再匹配1个属于i/n/p/u/t/a/m/e字符集的内容——整个规则和用户实际输了啥没关系,自然会出现任意短名字都能命中的离谱情况。 - 要实现大小写不敏感的匹配,根本不需要手动拼
[a-zA-Z]的字符范围,POSIX的regex库本身就内置了对应的编译开关。
直接能跑的修改方案
不需要动其他代码,只要给regcomp加个忽略大小写的标志就行:
把原来写的
return_value = regcomp(®ex, inputName, 0);
改成
return_value = regcomp(®ex, inputName, REG_ICASE);
REG_ICASE这个标志的作用就是编译正则规则时,自动忽略所有英文字母的大小写差异,完全不需要你手动调整正则的内容结构。
改完的实际效果
- 不管用户输入的是全小写的
michael、corleone,还是大小写混杂的mIChaEl coRLeone,都能正常匹配到预存的Michael Corleone字符串并输出 - 用户输入其他完全不相关的姓名(比如John、Leon、Angel),会正常触发
Pattern not found的提示,不会再出现误匹配
后续避坑提示
以后如果需要把用户输入的内容嵌到自定义正则规则里,绝对不能直接把变量名写在双引号的字符串字面量里——引号里的所有内容都会被当成固定正则规则处理,必须用snprintf等字符串拼接函数,把用户输入的实际内容替换到正则的对应位置,不然写出来的规则根本和用户输入没关系。
内容的提问来源于stack exchange,提问作者Kevin Mahendra
相关产品推荐
相关产品推荐

