如何在C中提取此字符串的一部分?

时间:2017-11-14 23:42:25

标签: c regex string

我有一个版本文件需要解析以获得C99中的某些版本。例如,假设其中一个字符串如下所示:

FILE: EXAMPLE ABC123459876-001 REV 1.IMG

12345号码可以是任意数字,但总是后跟4位数字和连字符+转速和扩展名。我只想返回这个字符串的中间位置,即文件名+主版本所以:“例9876-001 REV 1”。我让它在网上用regex101测试仪工作,例如:

"(?<=EXAMPLE ABC.....)(....-... REV .)(?=.IMG)"

...但是C99正则表达式不支持正向前瞻/后向运算符,所以这对我不起作用。我应该使用strstr()或strtok()吗?只是想找一些关于在C中做到这一点的最佳方法的想法,谢谢。

3 个答案:

答案 0 :(得分:1)

你真的需要正则表达式吗?你能不能将这个字符串拆分成子串并使用它?

  1. 您可以使用strchr
  2. 查找点来删除扩展程序
  3. 子串名文件名
  4. 使用正则表达式来完成([0-9]{4}.*$)
  5. 的其余部分

答案 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。