我有一个版本文件需要解析以获得C99中的某些版本。例如,假设其中一个字符串如下所示:
FILE: EXAMPLE ABC123459876-001 REV 1.IMG
12345号码可以是任意数字,但总是后跟4位数字和连字符+转速和扩展名。我只想返回这个字符串的中间位置,即文件名+主版本所以:“例9876-001 REV 1”。我让它在网上用regex101测试仪工作,例如:
"(?<=EXAMPLE ABC.....)(....-... REV .)(?=.IMG)"
...但是C99正则表达式不支持正向前瞻/后向运算符,所以这对我不起作用。我应该使用strstr()或strtok()吗?只是想找一些关于在C中做到这一点的最佳方法的想法,谢谢。
答案 0 :(得分:1)
你真的需要正则表达式吗?你能不能将这个字符串拆分成子串并使用它?
([0-9]{4}.*$)
答案 1 :(得分:1)
So you want everything except the File:
-prefix and the file ending? Since File
sounds static, this regex should work:
File: ([^\.]*)\..*
You can than get that group using regexec
答案 2 :(得分:0)
最简单的方法可能是使用sscanf,但它确实存在缓冲区溢出的风险(确保缓冲区长于系统上的最大文件路径长度,你应该没问题。)
尝试这样的事情(未经过测试的代码):
int ret;
char sequence_num_prefix[ MAX_PATH_LEN + 1 ] = {0};
char sequence_num_postfix[ MAX_PATH_LEN + 1 ] = {0};
char version_num[ MAX_PATH_LEN + 1 ] = {0};
char my_name[ MAX_PATH_LEN + 1 ] = {0};
ret = sscanf( input_path_buf, "EXAMPLE ABC%[0-9]-%[0-9] REV %[0-9]",
sequence_num_prefix, sequence_num_postfix, version_num);
if( ret != 3 )
{
//error
}
snprintf( my_name, sizeof( my_name ), "EXAMPLE %s-%s REV %s",
sequence_num_prefix, sequence_num_postfix, version_num );
当然更安全的方法是使用while循环,或者为了清洁,使用Bison。