c - 在 C 中获取正则表达式匹配行

标签 c regex numbers line

我编写了这段代码,用于查找在字符串 str 中找到模式“匹配”的文件并打印它。

#include <regex.h>
#include <string.h>
#include <stdio.h>
int main(int argc, const char *argv[]) {
    char *str = strdup("aaaaaaa match aaaaaaaaaaaaaaaaaaaa\n"
                       "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
                       "cc match ccccccccccccccccccccccccc");
    regex_t regex;
    regmatch_t match;
    regcomp(&regex, "match", REG_EXTENDED);
    while(regexec(&regex, str, 1, &match, 0) != REG_NOMATCH) {
        int beg = match.rm_so;
        int end = match.rm_eo;
        int len = end-beg;
        char *match_string = str+beg;
        match_string[len] = '\0';
        printf("%s\n", match_string);
        str = str + end + 1;
    }
    return 0;
}

我的问题是我需要找到比赛从哪一行开始。最好这应该适用于多行匹配,但现在单行就可以了。正则表达式是否有一些我可以用来解决这个问题的隐藏功能?

最佳答案

您可以使用 strtok() 解析这些行在每个 \n 处拆分字符串。

此外,可以使用struct来存储每一行​​:

typedef struct {
    char *str;
    size_t lineno;
} line_t;

然后一旦知道字符串中存在多少个\n,就可以创建一个结构数组:

line_t *lines = malloc((numlines+1) * sizeof(line_t));

每一行会这样存储:

Line 1: "aaaaaaa match aaaaaaaaaaaaaaaaaaaa"
Line 2: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
Line 3: "cc match ccccccccccccccccccccccccc";

然后您可以简单地再次使用 strtok() 来检查空格之间的模式。要比较字符串,strcmp会很好用。

下面是一些示例代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char *str;
    size_t lineno;
} line_t;

int main(void) {
    char str[] = "aaaaaaa match aaaaaaaaaaaaaaaaaaaa\n"
                 "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"
                 "cc match ccccccccccccccccccccccccc";
    const char *key = "match";
    const char *delim1 = "\n";
    const char *delim2 = " ";
    char *pattern;
    size_t numlines = 0, count = 0;

    for (size_t i = 0; str[i]; i++) {
        if (str[i] == '\n') {
            numlines++;
        }
    }

    line_t *lines = malloc((numlines+1) * sizeof(line_t));
    if (!lines) {
        printf("Cannot allocate %zu members\n", numlines+1);
        exit(EXIT_FAILURE);
    }

    pattern = strtok(str, delim1);
    while (pattern != NULL) {
        lines[count].str = malloc(strlen(pattern)+1);
        if (!lines[count].str) {
            printf("Cannot allocate %zu bytes\n", strlen(pattern)+1);
            exit(EXIT_FAILURE);
        }
        strcpy(lines[count].str, pattern);
        lines[count].lineno = count+1;
        count++;

        pattern = strtok(NULL, delim1);
    }

    for (size_t i = 0; i < count; i++) {
        pattern = strtok(lines[i].str, delim2);
        while (pattern != NULL) {
            if (strcmp(pattern, key) == 0) {
                printf("pattern '%s' found on line %zu\n", key, lines[i].lineno);
            }
            pattern = strtok(NULL, delim2);
        }
        free(lines[i].str);
        lines[i].str = NULL;
    }

    free(lines);
    lines = NULL;

    return 0;
}

注意:此代码使用动态内存分配 malloc() , 和 free()最后是指针。如果你想让我解释更多,请告诉我。

关于c - 在 C 中获取正则表达式匹配行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41958460/

相关文章:

php - 如果下一个字符是特定字符,则拆分字符串,例如 'abc'

javascript - 无穷大与 Number.POSITIVE_INFINITY

c - 将数据文件作为链表中的节点读取的函数

c - malloc 在编译时和运行时如何处理?

objective-c - 在 iphone 应用程序中解析和替换 @usernames 和 URL

c - LEX & YACC - 表达式中的空格

ios - 将拼写数字转换为数字

匹配任何字符之间的正则表达式和短语

C. 检查特定小数位数的 float 输入

java - 在计算圈复杂度时,退出当前方法/函数的语句应该是它的一部分吗?