gpt4 book ai didi

c语言正则表达式匹配字符串的多个部分

转载 作者:太空宇宙 更新时间:2023-11-04 07:53:19 24 4
gpt4 key购买 nike

我有一个 c 程序,我无法让正则表达式匹配按照我想要的方式工作。基本上,我想匹配 testStr 中的第一个字符(W 或 M)和日志文件的名称作为第二个匹配项 (TESTY.LOG)。这是我目前所拥有的:

#include    <stdio.h>
#include <stdlib.h>
#include <regex.h>
#define MAX_MATCHES 2
.....
char testStr[20]="W TESTY.LOG ";
char temp[100];
int reti;
regex_t regex;
regmatch_t matches[MAX_MATCHES];
int i;
int numchars;

/* Compile regular expression */
reti = regcomp(&regex, "^([W|M])[[:space:]]([A-Z|0-9|\.]{1,})[[:space:]]*$", REG_EXTENDED);
/* Execute regular expression */
reti = regexec(&regex, testStr, MAX_MATCHES, matches, 0);
if (!reti) {
for (i=0; i < MAX_MATCHES; i++) {
numchars = (int)matches[i].rm_eo - (int)matches[i].rm_so;
strncpy(temp,testStr+matches[i].rm_so,numchars);
temp[numchars] = '\0';
}
}

当我在 gdb 中运行它时,我看到以下匹配项:

(gdb) 显示匹配
1: 匹配 = {{rm_so = 0, rm_eo = 15}, {rm_so = 0, rm_eo = 1}}

2: temp = "W TESTY.LOG"

2: temp = "W"

所以,我得到第一个字符 OK,但我没有得到第二个匹配项的日志文件名。我在 perl 中使用正则表达式,但我是 ansi c 中的正则表达式的新手。我觉得我在这里缺少一些基本的东西。

最佳答案

匹配 0 是整个正则表达式匹配的字符串部分(Perl 的 $&)。 Match i for i> 0是匹配捕获号i对应的部分,同Perl的$1,$2, ...。你有两次捕获,所以你应该期待三场比赛。但是您将 MAX_MATCH 指定为 2,因此最后一个匹配项将被丢弃。


还有正则表达式

^([W|M])[[:space:]]([A-Z|0-9|\.]{1,})[[:space:]]*$

有点奇怪。我认为您应该重新阅读有关正则表达式中字符类的文档——在这种情况下,它在 Perl 中与在 Posix 扩展 RE 中相同。 [W|M] 匹配 W|M 这三个字符中的任何一个。类似地,[A-Z|0-9|\.]{1,} 匹配一个或多个字母、数字、字符 | 或字符 ..

反斜杠是无关紧要的,因为它只对字符串文字中的 . 进行转义,而无需进行转义。如果您编译时启用了警告,-Wall,您的 C 编译器可能会警告您转义序列不合法。如果您实际上已将反斜杠传递给正则表达式库,它会将其解释为字符类的另一个可能匹配项。

此外,{1,} 在 Perl 和 Posix Extended RE 中都可以方便地写成 +

简而言之,您可能想要的是:

reti = regcomp(&regex, "^([WM])[[:space:]]([A-Z0-9.]+)[[:space:]]*$", REG_EXTENDED)

你也可以使用

reti = regcomp(&regex, "^([WM])[[:space:]]([[:alnum:].]+)[[:space:]]*$", REG_EXTENDED)

关于c语言正则表达式匹配字符串的多个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52408419/

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