gpt4 book ai didi

C - regexec 返回 NOMATCH - 即使它应该?

转载 作者:太空宇宙 更新时间:2023-11-04 02:31:56 27 4
gpt4 key购买 nike

正则表达式模式需要匹配以下内容:

abc_xyz_0
abc_1025_01.29.00_xyz_0
abc_0302_42.01.00_xyz_0

(abc 和 xyz 之间的数字无关紧要)

所以我解析为:

(abc_(\w+\.\d+\.\w+)?xyz_0)

我的代码:

regex_t r;
unsigned int maxGroups = 3;
regmatch_t groupArray[maxGroups];
char * to_match = "abc_0302_02.01.00_xyz_18 abc_0302_02.01.00_xyz_16 abc_0302_02.01.00_xyz_14 abc_0302_02.01.00_xyz_0 abc_0302_02.01.00_xyz_10 abc_0302_02.01.00_xyz_2"

if (0 != regcomp(&r, "(abc_(\\w+\\.\\d+\\.\\w+)?xyz_0)", REG_EXTENDED))
{
//this does NOT get hit
printf("regcomp failed")
}
else if(regexec(r, to_match, maxGroups, groupArray, REG_EXTENDED) == 0)
{ *never gets here* }
else
{ printf("regexec returned non-zero(No Matches)\n"); }

regfree(&r);

所以我的猜测是我有错误的正则表达式(这对我上面定义的情况工作正常 - 我使用 regexpal.com 来确认),或者我遗漏了什么?

无论哪种方式,我都知道我很接近并且非常感谢一些帮助。

最佳答案

您复制到问题中的代码中有几个拼写错误(见下文),您应该只传递 REG_EXTENDEDregcomp ;唯一的标志 regexec识别为 REG_NOTBOLREG_NOTEOL . (有关详细信息,请参阅 regexec manpage。)

但是,问题是 Posix 正则表达式(包括 Gnu 实现)没有实现非标准转义序列 \d .如 regex(7) manpage 中所示, 模式可以包括:

a '\' followed by one of the characters "^.[$()|*+?{\" (matching that character taken as an ordinary character),

a '\' followed by any other character (matching that character taken as an ordinary character, as if the '\' had not been present)

请注意,\ 的唯一效果, 在任何一种情况下,都会导致后面的字符作为普通字符进行匹配。虽然 regcomp 的 Gnu 实现确实识别 \w作为一个字符类,Posix 不需要这种行为,其他实现可能不会这样做。 (它也没有记录,所以它可能并不总是有效。)而且它不识别 \d .

如果您使用的是 Posix 正则表达式,则应使用 Posix 标准字符类,因此正则表达式字符串应为:

"(abc_([[:alnum:]_]+\\.[[:digit:]]+\\.[[:alnum:]_]+)?xyz_0)"

您将在上一个链接的正则表达式联机帮助页中找到 Posix 命名字符类的列表(或者如果您已经安装了标准库文档,则键入 man 7 regex,强烈推荐这样做。)

char * to_match =... 末尾添加缺少的分号后,我用您的代码验证了这一点和改变r&r在调用 regexec .

请注意,很少有在线正则表达式资源实现了 Posix 正则表达式规范; http://regexpal.com ,例如,仅提供 PCRE 和 Javascript 样式正则表达式的选项。


每次调用regexec , 根据 man 7 regex 中描述的固定算法,您将获得传递给它的字符串中的第一个匹配项:

In the event that an RE could match more than one substring of a given string, the RE matches the one starting earliest in the string. If the RE could match more than one substring starting at that point, it matches the longest. Subexpressions also match the longest possible substrings, subject to the constraint that the whole match be as long as possible, with subexpressions starting earlier in the RE taking priority over ones starting later. Note that higher-level subexpressions thus take priority over their lower-level component subexpressions.

如果你想在同一个字符串中找到一个模式的多个实例,你需要调用regexec在一个循环中。每次通过循环,您都会给它上一个匹配项(即 string + matches[0].rm_eo)的第一个不匹配字节的地址,直到它报告不再有匹配项为止。如果你依赖^匹配中的 anchor ,您需要传递 REG_NOTBOL 的正确值标记每次调用 regexec .

关于C - regexec 返回 NOMATCH - 即使它应该?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42149031/

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