如何在C++ std::string中实现关键词的精确全词匹配
C++ 实现字符串精确全词匹配的方案
std::string::find默认仅校验子串存在性,不会判断匹配到的内容是否为独立单词,因此会出现关键词匹配到更长单词前缀的误判问题,以下是两种常用实现方案:
方案1:手动校验边界(性能优先,无额外依赖)
思路:每次找到关键词的匹配位置后,额外校验匹配段的前后边界是否符合独立单词的要求即可,可根据业务自定义单词组成规则,示例默认单词由大小写字母、数字、下划线组成:
#include <string> #include <iostream> #include <cctype> // 自定义单词组成字符判定规则 bool isWordChar(char c) { return std::isalnum(c) || c == '_'; } bool findWholeWord(const std::string& s, const std::string& keyword) { size_t pos = 0; size_t keyLen = keyword.size(); while ((pos = s.find(keyword, pos)) != std::string::npos) { // 校验前边界:要么是字符串开头,要么前一个字符不是单词组成字符 bool leftOk = (pos == 0) || !isWordChar(s[pos - 1]); // 校验后边界:要么是字符串末尾,要么后一个字符不是单词组成字符 bool rightOk = (pos + keyLen == s.size()) || !isWordChar(s[pos + keyLen]); if (leftOk && rightOk) { return true; } pos += keyLen; } return false; } int main() { std::string s1 = "IAmLookingForAwordU and I am the rest of the phrase"; std::string keyWord = "IAmLookingForAword"; if (findWholeWord(s1, keyWord)) { std::cout << "Found " << keyWord << std::endl; } else { std::cout << "Not found" << std::endl; } return 0; }
上述示例运行后会输出Not found,符合预期。
方案2:使用正则表达式(开发效率优先,适合复杂规则)
C++11及以上版本支持标准库正则模块,利用正则的\b单词边界元字符可以快速实现全词匹配,注意如果关键词包含正则特殊字符(比如. * + ?等)需要先做转义处理:
#include <string> #include <iostream> #include <regex> int main() { std::string s1 = "IAmLookingForAwordU and I am the rest of the phrase"; std::string keyWord = "IAmLookingForAword"; // 构造全词匹配正则,\b代表单词边界 std::regex reg("\\b" + keyWord + "\\b"); if (std::regex_search(s1, reg)) { std::cout << "Found " << keyWord << std::endl; } else { std::cout << "Not found" << std::endl; } return 0; }
如果性能要求高、关键词包含正则特殊字符,优先选择方案1;如果需要灵活调整匹配规则、希望减少开发量,优先选择方案2。
内容的提问来源于stack exchange,提问作者user8458838
相关产品推荐
相关产品推荐

