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