c++ - 使用 SLRE 正则表达式查找两个标签之间的数据

标签 c++ c regex regex-negation

我有一个字符串

static const char *str = ",<ABC$>EEEEEEEE$>,EEE<$WQWERRERR<$ABC>,2233My Name Is $Tom,<ABC$>$>,TTTTTTTEEE<$WQWERRERR<$ABC>,2233My Name Is Jake,<ABC$>$>";

我想获取 <ABC$>, 之间的所有文本 header 和 ,<ABC$>页脚。

现在如果我使用表达式

static const char *regex = "<\\$ABC>,([^>]*),<ABC\\$>";

请注意我使用的是 [^>]使其非贪婪

并使用

打印出来
 struct slre_cap caps[2];
    int i, j = 0, str_len = strlen(str);

    while (j < str_len &&
       (i = slre_match(regex, str + j, str_len - j, caps, 2)) > 0) {
      printf("Found Data: [%.*s]\n", caps[0].len, caps[0].ptr);
      j += i;
    }

我的输出看起来像

 Found Data: [2233My Name Is $Tom]
 Found Data: [2233My Name Is Jake]

到目前为止一切都很好,但现在为了添加一个曲线球,我引入了一个 > (我计划稍后使用的二进制序列化协议(protocol),例如 protobuf-embedded-c 可能引入)页眉和页脚之间的字符,例如<$ABC>,2233My Name Is> $Tom,<ABC$> .现在突然间,结果不一样了。因此我想知道是否有一种方法可以否定这个词 ABC而不是单个字符 >对于非贪婪的方法。据我所知,其他正则表达式库使用负前瞻/后视来执行此操作,这在 SLRE 中不可用。是否可以在 SLRE 中模拟这种行为?谢谢。

最佳答案

也许正则表达式在这里不是合适的工具。您只需搜索固定的定界字符串即可找到您的子表达式:

const char *p = str;

for (;;) {
    const char *q, *r;
    int len;

    r = strstr(p, "<$ABC>");
    if (r == NULL) break;
    r += 6;

    q = strstr(r + 6, "<ABC$>");
    if (q == NULL) break;

    len = q - r;
    printf("'%.*s'\n", len, r);
    p = q + 6;
}

编辑:正如评论中所指出的,定界符之间捕获的字符串当然必须在开始定界符之后开始,但是 strstr 找到了它的开头。因此,必须将定界字符串的长度(此处为 6)添加到 r

同理,如果捕获的字符串应该包含分隔符,rstrstr搜索后保持原样,并且必须添加结束分隔符的长度到 q:

    r = strstr(p, "<$ABC>");
    if (r == NULL) break;

    q = strstr(r + 6, "<ABC$>");
    if (q == NULL) break;
    q += 6;

    len = q - r;
    printf("'%.*s'\n", len, r);
    p = q;

关于c++ - 使用 SLRE 正则表达式查找两个标签之间的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22097338/

相关文章:

php - str_用连字符替换 A 标签名称属性中的空格

c++ - std::is_base_of 用于模板类

c++ - 如何将视频帧从 C++ 传递到 chromium 嵌入式框架(cef)?

c++ - 需要包含运行任务时间的二维矩阵的最优解

c++ - C++向下转换期间的内存布局

对 DLL 和 WM_QUERYENDSESSION 中的 CTRL_SHUTDOWN_EVENT 处理感到困惑

c - 霍夫曼表熵解码简化(在 C 中)

c - 在使用 C 的 Linux 中,如何将整个环境写入文件?

这些特殊字符的 javascript 正则表达式

java - Java中通过正则表达式提取