我有一个奇怪的问题。我正在寻找一个与Visual Studio一起使用的轻量级正则表达式库。有人推荐我https://github.com/cesanta/slre;这个图书馆是我所需要的,它的重量非常轻。
问题是它在Visual Studio 2013下不起作用。我使用以下示例编译它,但是从未到达printf statament。
static const char *str =
"<img src=\"HTTPS://FOO.COM/x?b#c=tab1\"/> "
" <a href=\"http://cesanta.com\">some link</a>";
static const char *regex = "(?i)((https?://)[^\\s/'\"<>]+/?[^\\s'\"<>]*)";
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)) > 0) {
printf("Found URL: [%.*s]\n", caps[0].len, caps[0].ptr);
j += i;
}
有人可以看看,或者推荐我做错了什么。
答案 0 :(得分:3)
slre
库中似乎存在一个错误,通过使用(?i)
启动正则表达式来区分大小写匹配。他们甚至在他们的单元测试中都有你的例子,但不检查这个测试是否通过:)
好消息是,您可以通过删除正则表达式开头的(?i)
部分并将调用中的最后一个参数更改为slre_match
来SLRE_IGNORE_CASE
,从而对解决方法进行不区分大小写的匹配(或简称为1
,因为这是此常量在slre.h
}中设置的值,而不是普通0
。
因此,在您的示例中正确使用slre_match
是
slre_match(regex, str + j, str_len - j, caps, 2, SLRE_IGNORE_CASE)
并删除正则表达式开头的(?i)
部分。
答案 1 :(得分:0)
正如另一个答案所提到的(正如我乍一看的那样),(?i)
尚未得到slre的支持,即使文档中提到并在示例中使用过
明确传递SLRE_IGNORE_CASE
肯定是一种选择,但您也可以以最简单的形式添加对(?i)
的支持,因为它已记录:不支持(?iiii)
或任何其他标志,只是固定的(?i)
前缀。
slre.c
的补丁非常简单。 (也许将它作为拉取请求提交给github是有意义的)。
diff --git a/slre.c b/slre.c
index 4a7fd89..d3c7672 100644
--- a/slre.c
+++ b/slre.c
@@ -429,5 +429,9 @@ int slre_match(const char *regexp, const char *s, int s_len,
info.caps = caps;
DBG(("========================> [%s] [%.*s]\n", regexp, s_len, s));
+ if (!strncmp("(?i)",regexp,4)) {
+ regexp+=4;
+ info.flags |= SLRE_IGNORE_CASE;
+ }
return foo(regexp, (int) strlen(regexp), s, s_len, &info);
}