我是 C 语言的新自行车,在了解了如何在 ANSI C 中使用正则表达式的一些简单示例和最佳实践之后。我有简单的测试,想要在下面的描述字符串中获取日期“{d(02/01/2019 )}-致电Ms.ha检查此案”。我的意思是想要得到“02/01/2019”这是我的代码
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <regex.h>
#define ARRAY_SIZE(arr) (sizeof((arr)) / sizeof((arr)[0]))
// initialize target string and regular expression string
int main(int argc, char **argv)
{
regex_t preg;
char *string = "{d(02/01/2019)}-call Ms.ha check this case";
char *pattern="?[0-9]+(\\/[0-9]+)+(\\/[0-9]+)?"; // I'm stupid pattern in here.
size_t nmatch = 2;
regmatch_t pmatch[2];
regcomp(&preg, pattern, REG_EXTENDED);
regexec(&preg, string, nmatch, pmatch, 0);
printf("a matched substring \"%.*s\" is found at position %d to %d.\n",
pmatch[1].rm_eo - pmatch[1].rm_so, &string[pmatch[1].rm_so],
pmatch[1].rm_so, pmatch[1].rm_eo - 1);
regfree(&preg);
return EXIT_SUCCESS;
}
在这种情况下如何创建模式,
谢谢建议。
您不需要在开头和结尾处使用任何分隔符(可能受到 PHP 历史的影响?我不知道有任何其他语言需要在字符串中使用它们)。您也不需要转义斜杠,因为它们在这里没有特殊含义(仅在斜杠为分隔符的语言/结构中才需要)。
还有,你想要
pmatch[0]
,不想要pmatch[1]
。后者只是为您提供第一个捕获组 的内容/01
。regcomp
您将需要检查和的结果regexec
;忽视它们就会给你的生活带来错误。在您的情况下,?
在模式开始时正在生成REG_BADRPT
(重复运算符的无效操作数)regcomp
。例如:regexec
应该给出较小范围的问题;如果0
,你很好;如果REG_NOMATCH
,不言自明。如果除此之外...如果您想知道发生了什么,您可以做与上面相同的事情。