对于不区分大小写的搜索,slre regex库无法使用(?i)开头的正则表达式

时间:2015-04-04 17:46:35

标签: regex visual-studio-2013

我有一个奇怪的问题。我正在寻找一个与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;
}

有人可以看看,或者推荐我做错了什么。

2 个答案:

答案 0 :(得分:3)

slre库中似乎存在一个错误,通过使用(?i)启动正则表达式来区分大小写匹配。他们甚至在他们的单元测试中都有你的例子,但不检查这个测试是否通过:)

好消息是,您可以通过删除正则表达式开头的(?i)部分并将调用中的最后一个参数更改为slre_matchSLRE_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);
 }