C语言如何实现在字符串中查找完全匹配的独立单词
C语言实现字符串中独立单词的精准匹配
要实现完全匹配独立单词的需求,核心是要保证匹配到的目标字符串前后是字符串边界或者空白分隔符,不能和其他字符连续拼接。以下是两种可直接运行的实现方案:
方案1:手动实现匹配逻辑(无第三方依赖,兼容性最好)
核心判断规则
- 匹配到目标字符串后,先校验前缀:如果匹配位置不是原字符串开头,前一个字符必须是空白字符
- 再校验后缀:如果匹配位置+目标单词长度不是原字符串结尾,后一个字符必须是空白字符
完整实现代码
#include <stdio.h> #include <string.h> #include <ctype.h> /** * 查找原字符串中的独立目标单词 * @param src 待检索的原字符串 * @param target 要匹配的目标单词 * @return 匹配成功返回原字符串中匹配单词的起始指针,匹配失败返回NULL */ char* find_whole_word(const char* src, const char* target) { int target_len = strlen(target); // 目标单词为空直接返回 if (target_len == 0 || src == NULL) return NULL; const char* cur_ptr = src; // 循环查找目标子串的所有匹配位置 while ((cur_ptr = strstr(cur_ptr, target)) != NULL) { // 校验前缀合法 int prefix_valid = (cur_ptr == src) || isspace((unsigned char)*(cur_ptr - 1)); // 校验后缀合法 int suffix_valid = (*(cur_ptr + target_len) == '\0') || isspace((unsigned char)*(cur_ptr + target_len)); if (prefix_valid && suffix_valid) { return (char*)cur_ptr; } // 不匹配则指针后移一位继续查找 cur_ptr++; } return NULL; } // 测试用例 int main() { const char* str1 = "cats dog"; const char* str2 = "cat dog"; const char* target = "cat"; char* res1 = find_whole_word(str1, target); printf("检索\"%s\"的结果:%s\n", str1, res1 ? res1 : "无匹配"); char* res2 = find_whole_word(str2, target); printf("检索\"%s\"的结果:%s\n", str2, res2 ? res2 : "无匹配"); // 如果需要单独返回匹配的单词,可按如下方式截取 if (res2) { char match_word[256] = {0}; strncpy(match_word, res2, strlen(target)); printf("单独提取匹配到的单词:%s\n", match_word); } return 0; }
运行输出结果
检索"cats dog"的结果:无匹配
检索"cat dog"的结果:cat dog
单独提取匹配到的单词:cat
方案2:正则匹配实现(适合复杂分隔规则场景)
如果后续需要扩展分隔规则(比如把下划线、特殊符号也认定为单词分隔符),可以用POSIX标准的regex.h库,用单词边界元字符\b直接实现匹配。
#include <stdio.h> #include <regex.h> #include <string.h> char* find_whole_word_regex(const char* src, const char* target) { regex_t regex; char pattern[256]; // 构造带单词边界的正则规则 snprintf(pattern, sizeof(pattern), "\\b%s\\b", target); // 编译正则表达式 if (regcomp(®ex, pattern, REG_EXTENDED | REG_NOSUB) != 0) { regfree(®ex); return NULL; } // 执行匹配 int match_ret = regexec(®ex, src, 0, NULL, 0); regfree(®ex); if (match_ret == 0) { // 如需精准获取匹配偏移,可去掉REG_NOSUB参数获取匹配位置信息 return strstr(src, target); } return NULL; }
注意事项
- 正则方案依赖POSIX运行环境,Windows下需要额外引入正则库才能运行,兼容性比手动实现方案差
- 如果自定义分隔规则,只需要修改正则规则或者手动实现里的前缀后缀判断逻辑即可
内容的提问来源于stack exchange,提问作者trezurka
相关产品推荐
相关产品推荐

