gpt4 book ai didi

C POSIX 正则表达式失败

转载 作者:太空宇宙 更新时间:2023-11-04 00:03:16 25 4
gpt4 key购买 nike

我正在尝试在 C 编程语言中使用 POSIX 正则表达式。

我有这些正则表达式模式:

const char *regular_expression_pattern_keyword = "^(auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)";
const char *regular_expression_pattern_identifier = "^[:word:]";
const char *regular_expression_pattern_number = "^[:digit:]*";
const char *regular_expression_pattern_punctuator = "^[:punct:]";

要检查雷鬼,我有一个函数:

char **patterns = malloc ((sizeof (char) * 256) * 4);

patterns[0] = (char *) regular_expression_pattern_keyword;
patterns[1] = (char *) regular_expression_pattern_identifier;
patterns[2] = (char *) regular_expression_pattern_number;
patterns[3] = (char *) regular_expression_pattern_punctuator;

for (int i = 0; i < 4; i++)
{
regex_t regular_expression;
int status;

status = regcomp(&regular_expression, patterns[i], 0);

if (status)
{
// FIXME: Improve error handling!
printf("Error: Failed to compile regex!\n");
exit(1);
}

status = regexec(&regular_expression, "auto", 0, NULL, 0);

if (!status)
{
printf("Regex status: Match ->%s\n", patterns[i]);
}

else if (status == REG_NOMATCH)
{
printf("Regex status: No match\n");
}

else
{
// FIXME: Improve error handling!
printf("Error: Failed to match regex!\n");
exit(1);
}

regfree(&regular_expression);
}

free (patterns);

由于我不知道的原因,此雷鬼检查将 auto 匹配为 Regex status: Match ->^[:digit:]*。我做错了什么?

最佳答案

这里有几点需要注意:

  • [:digit:] 和其他 POSIX 字符类必须在括号(“字符”)类中使用(例如 [[:digit:]] ), 不孤单。否则,它们匹配类中的单独符号,即 [:digit:] 匹配 1 个符号,:d, igt

  • 要使用交替和未转义的方括号/圆括号进行量化/分组,您需要将 REG_EXTENDED 标志与 regcomp 一起使用,以使用 ERE 正则表达式语法。如果不传递此标志,则您使用的是 BRE 正则表达式语法,这是相当糟糕的。

现在,为什么 ^[:digit:]* 匹配 auto?因为您要求正则表达式引擎查找零个 个或多个字符,:dig,或 t。它确实在字符串的开头找到了零个这样的字符,因此,您有一个匹配项。

^[[:digit:]]\{1,\} match 1ab which is not a number at all

不,模式不匹配 1ab,它只匹配 1ab 中的 1,因为您没有指定任何边界 或 anchor 。

要仅匹配字符串开头的数字(=数字序列),请使用

"^[[:digit:]]+(\\W|$)" (or "^[[:digit:]]+([^[:digit:][:alpha:]_]|$)"

不要忘记将 REG_EXTENDED 标志传递给 regcomp 函数。

参见 this demo .请注意,在 ERE 正则表达式语法中,您可以使用 + 来匹配 1 个或多个字符,而在 BRE(没有 REG_EXTENDED)中,您必须使用 \{ 1,\}.

关于C POSIX 正则表达式失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34117450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com