在C语言上使用regex library并不熟悉。目前我正在尝试使用Regexec() and Regcomp()函数来搜索与我的模式或正则表达式匹配的字符串。但我不能生成我匹配的字符串。我错过了我的代码,或任何功能的故障使用?
我的示例代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <regex.h>
int main(int argc, char ** argv)
{
regex_t r;
const char * my_regex = "(\\d+.\\d+.\\d+.\\d+)";
const char * my_string = "Am trying to match any ip like, 23.54.67.89 , in this string and 123.232.123.33 is possible";
const int no_of_matches = 10;
regmatch_t m[no_of_matches];
printf ("Trying to match '%s' in '%s'\n", my_regex, my_string);
int status = regcomp (&r, my_regex, REG_EXTENDED|REG_NEWLINE);
printf("status: %d\n",status);
if(status!=0)
{
printf ("Regex error compiling \n");
}
int match_size = regexec (&r, my_string, no_of_matches, m, 0);
printf("Number of Matches : %d\n",match_size);
int i = 0;
for (i = 0; i < match_size; i++)
{
//Now i wana print all matches here,
int start = m[i].rm_so;
int finish = m[i].rm_eo;
printf("%.*s\n", (finish - start), my_string + start);
}
regfree (& r);
return 0;
}
在这里,问题是:我无法打印我的比赛。有什么建议吗?我在linux上。 我已经编辑了我的for循环,现在打印出来了:
Trying to match '(\d+.\d+.\d+.\d+)' in 'Am trying to match any ip like, 23.54.67.89 , in this string and 123.232.123.33 is possible'
status: 0
Number of Matches : 1
m trying to match any ip like, 23.54.67.89 , in this string and 123.232.123.33 is possible
但我期待着我的出局:
Trying to match '(\d+.\d+.\d+.\d+)' in 'Am trying to match any ip like, 23.54.67.89 , in this string and 123.232.123.33 is possible'
status: 0
Number of Matches : 2
23.54.67.89
123.232.123.33
答案 0 :(得分:2)
您的正则表达式不是POSIX正则表达式。你正在使用Perl / Tcl / Vim的味道,它不会像你希望的那样工作。
regcomp()
和regexec()
是POSIX regular expressions,因此是POSIX兼容(或仅POSIX-y)C库的一部分。它们不仅仅是一些正则表达式库的一部分;这些是POSIX标准的东西。
特别是,POSIX正则表达式无法识别\d
或任何其他反斜杠字符类。您应该使用[[:digit:]]
代替。 (字符类括在括号中,因此要匹配任何数字或小写字母,您可以使用[[:digit:][:lower:]]
。对于除控制字符之外的任何内容,您可以使用[^[:cntrl:]]
。)
一般情况下,您可以查看Character classes维基百科文章中的Regular expressions表格,其中包含带有说明的等效类的简明摘要。
您是否需要一个可识别区域设置的示例来演示此内容?