我有一个字符串
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
。
同理,如果捕获的字符串应该包含分隔符,r
在strstr
搜索后保持原样,并且必须添加结束分隔符的长度到 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/