【问题标题】:Match POSIX substring in C匹配 C 中的 POSIX 子字符串
【发布时间】:2013-08-05 16:44:46
【问题描述】:

我想打印匹配“字节”的子表达式。我已经简化了这个例子,所以我可以调试我的代码的其他组件:

char *bytes="[[:print:]]*\(bytes\)";
regex_t compiled;
regmatch_t matches[2];
char currentLine[512];

fgets(currentLine, 512, ifile);
regcomp(&compiled, bytes, REG_EXTENDED);
if(regexec(&compiled, currentLine, 2, matches, 0)==0){
    printf("%s\n", bytes+matches[1].rm_so);
}

在哪里

currentLine= "Free Memory: 5062026704 bytes (79%)";'

发生在 fgets 之后。

我收到的打印行是来自另一个函数的未格式化的 printf 语句——它在这个函数之后运行。对于我的问题可能出在哪里(正则表达式语法、内存分配、regmatch_t 的使用),我有一些不同的想法,而且我整个早上都在尝试不同的解决方案组合,但至今无济于事。

如何正确打印匹配的子字符串?

【问题讨论】:

    标签: c regex pattern-matching posix


    【解决方案1】:

    不同的问题,但使用来自here 的一些示例代码我修改了这一行:

    char *bytes="[[:print:]]*\(bytes\)";
                             ^      ^
    

    到这里:

    char *bytes="[[:print:]]*(bytes)";
                            ^ 
    

    并修改打印语句如下:

    printf("0: [%.*s]\n", matches[0].rm_eo - matches[0].rm_so, currentLine + matches[0].rm_so);
    printf("1: [%.*s]\n", matches[1].rm_eo - matches[1].rm_so, currentLine + matches[1].rm_so);
    

    您可能以前没有见过的格式字符串,但thread 很好地涵盖了它。

    【讨论】:

    • 您只想删除反斜杠,而不是用星号替换第二个。如现在所写,它将匹配bytebytesssssssss。 (嗯,看起来 OP 尝试编写基本正则表达式,暂时忘记了 C 的字符串转义,但无论如何将其编译为扩展 RE。)
    • @pilcrow 这是一个愚蠢的错误,感谢您指出。
    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 2011-03-20
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2023-03-28
    • 1970-01-01
    相关资源
    最近更新 更多