在嵌入式业务逻辑中,我们有时需要从配置文件、串口或者服务端接收的消息数据中进行字符串解析,来提取需要的目标字符串字段。通常我们会调用字符串处理相关的函数,例如strstr,strchr,sscanf等,再结合指针偏移来提取目标字段。实现这种方式的前提是,我们需要提前知道字符串固定的格式内容,如果待解析的字符串内容或者格式偏差的情况,那么我们编写好的字符串解析处理程序就不太适用了。以下是一个通用的对于从字符串中解析IP地址的函数接口,只要字符串中有完整的IP地址字段就会被提取出来。以供参考。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <regex.h>#define OUT
#define INchar extract_IPInfo(IN char *str, OUT char *ip)
{regex_t regex;regmatch_t pmatch[1];const char *pattern = "([0-9]{1,3}\\.){3}[0-9]{1,3}";int ret;// Compile the regular expressionret = regcomp(®ex, pattern, REG_EXTENDED);if (ret) {fprintf(stderr, "Could not compile regex\n");return 0;}// Execute the regular expressionconst char *p = str;while (regexec(®ex, p, 1, pmatch, 0) == 0) {// Extract the matched IP addressint start = pmatch[0].rm_so;int end = pmatch[0].rm_eo;strncpy(ip, p + start, end - start);ip[end - start] = '\0';// Print the matched IP addressprintf("Found IP: %s\n", ip);// Move the pointer forwardp += end;}// Free compiled regular expressionregfree(®ex);return 1;
}