【问题标题】:How to extract just part of this string in C?如何在 C 中仅提取此字符串的一部分?
【发布时间】:2017-11-14 23:42:24
【问题描述】:

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

FILE: EXAMPLE ABC123459876-001 REV 1.IMG

12345 数字可以是任意数字,但后跟 4 位数字和一个连字符 + 一个 rev 和一个扩展名。我只想返回这个字符串的中间,即文件名+主版本so:“EXAMPLE 9876-001 REV 1”。我让它在 regex101 在线测试仪中工作,如下所示:

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

...但是 C99 正则表达式不支持积极的前瞻/后瞻运算符,所以这对我不起作用。我应该使用 strstr() 还是 strtok() 代替?只是寻找一些关于在 C 中执行此操作的最佳方法的想法,谢谢。

【问题讨论】:

  • 数字可能更短或更长,但总是希望将最后 4 + 所有内容拉到“.”。加上文件名本身就是“示例”。尝试以半干净的方式来做这件事。

标签: c regex string


【解决方案1】:

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

  1. 您可以通过找到带有strchr 的点来删除扩展名
  2. 文件名的子串
  3. 使用正则表达式通过([0-9]{4}.*$) 获取其余部分

【讨论】:

  • 如果这是最好的方法,我会这样做。只是在寻找建议。显然,C 语言中的字符串解析并不是最漂亮的,所以我们使用了一个简单的正则表达式,但看起来它不适用于这个旧的正则表达式库,尤其是只想提取部分匹配项。
  • 这似乎是最简洁的解决方案,它以最容易阅读的代码完成,不依赖于多组正则表达式或 memmoves / sscans。谢谢。
【解决方案2】:

所以你想要除了File:-前缀和文件结尾之外的所有内容?因为File 听起来是静态的,所以这个正则表达式应该可以工作:

File: ([^\.]*)\..*

您可以使用 regexec 获取该组

【讨论】:

  • 看起来这将是第 1 组的一部分,而不是完整的比赛。我想这可行,但只需要额外的代码来获取该组。
  • 是的,您想要的部分将是第 1 组
  • 似乎这会返回字符串的整个中间,这不是我想要的。这将返回“示例 ABC123459876-001 REV 1”。我正在寻找可以返回“EXAMPLE 9876-001 REV 1”的东西。
  • 哦,对不起,我没有注意到丢失的 ABC。你仍然可以分成两组。
【解决方案3】:

最简单的方法可能是使用 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。

【讨论】:

    猜你喜欢
    • 2017-09-18
    • 2014-12-11
    • 1970-01-01
    • 2019-07-13
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    相关资源
    最近更新 更多