0

我正在使用 slre ( https://code.google.com/p/slre/ ) 为 ac 程序提供正则表达式库。

我想用以下模式匹配一​​个 IP 地址:"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"

我收到以下编译错误:Warning: unknown excape sequence '\.' 我也试过用'\\。' --> 编译错误消失了,但还是说不匹配。

   if (!slre_compile(&slre, settings[i].regex)) {
       printf("Error compiling RE: %s\n", slre.err_str);
   } 
   else if (!slre_match(&slre, settings[i].value, strlen(settings[i].value), captures)) {
       printf("\nSetting '%s' does not match the regular expression!", settings[i].internName);
   }

settings[i].regex 是一个 char* 与我上面提到的正则表达式 settings[i].value 是一个 char* 我要匹配的字符串是 8.8.8.8

有没有其他方法可以检查一个点?

4

3 回答 3

5

尝试[.]

点在字符类中并不特殊。

于 2013-05-16T19:16:48.140 回答
4

C 编译器将您的反斜杠视为在 C 中转义字符的尝试,其方式与\n成为换行符的方式相同。您需要使用双反斜杠:

\\.

C 编译器会将其转换为单个反斜杠并将其传递给正则表达式库。

这就是编译器警告的来源——如果在添加额外的反斜杠后它仍然不匹配,那么你也会遇到不同的问题。

根据http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx您的正则表达式确实匹配8.8.8.8,所以问题不在于正则表达式本身。

于 2013-05-16T19:20:09.463 回答
0

你的问题是关于 C 的,但如果你可以用 C++11 编译,你可以看看文字原始字符串

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2442.htm

std::string literal_string = R"literal string\. \n";
于 2013-05-16T19:25:26.337 回答