fnmatch用于复杂模式C

时间:2018-05-29 19:49:25

标签: c posix

我只能匹配简单的模式,如:" [0-9]"与

fnmatch("[0-9]", tocheck, 0)

但如果给我更复杂的东西?要么 。甚至这些的组合如何使用fnmatch? 我看到有一些标志可以解决问题,但我不知道如何使用,因为我对C来说相当新。

编辑:我看到答案要求提供更多细节:

#include <stdio.h>
#include <fnmatch.h>

int main (int argc, char** argv){
 const char* patternOne = "[0-9]";
 const char* patternTwo = ".?[a-z0-9]*?*[a-z0-9]";
 int res = fnmatch(patternTwo, "0", 0);
 printf("Result: %d\n",  res);
}

如果我使用patternOne,则结果为0(如果我更改字符串以匹配,则结果会正确更改)。 但是,如果我使用patternTwo,我永远不会得到&#34;结果:0&#34;对于我传递给fnmatch的任何字符串。 我需要在我的程序中匹配这样的东西(这是为了大学考试,所以模式非常错综复杂)

2 个答案:

答案 0 :(得分:1)

将模式视为shell glob模式。给出:

const char* patternTwo = ".?[a-z0-9]*?*[a-z0-9]";

"0"无法与之匹配。与之匹配的字符串示例为:".XaX9"

  

.匹配.
      X匹配?
      a匹配[a-z0-9]
      X匹配*?*
      9匹配[a-z0-9]

fnmatch()glob()不同的原因是模式"*"(作为普通的glob匹配任何字符串)将无法匹配名为{{1}的文件因为点文件被视为隐藏(它是设计用于执行文件名匹配的功能)。

答案 1 :(得分:0)

#define _GNU_SOURCE
#include <stdio.h>
#include <fnmatch.h>

int main(int argc, char **argv) {
    const char *patternOne = "[0-9]";
    const char *patternTwo = ".?[a-z0-9]*?*[a-z0-9]";
    int res = fnmatch(patternTwo, "0", FNM_EXTMATCH);
    printf("Result: %d\n",  res);
}

设置 FNM_EXTMATCH 标志可以像 .?[a-z0-9]*?*[a-z0-9] 一起使用

FNM_EXTMATCH 除了正常模式,还要识别 ksh 中引入的扩展模式。模式以下表中解释的形式编写,其中模式列表是 |分隔的模式列表。

?(pattern-list) 如果模式列表中任何模式的零次或一次出现允许匹配输入字符串,则模式匹配。

(pattern-list) 如果模式列表中任何模式的零次或多次出现允许匹配输入字符串,则模式匹配。

+(pattern-list) 如果模式列表中任何模式的一个或多个出现允许匹配输入字符串,则模式匹配。

@(pattern-list) 如果模式列表中的任何模式恰好出现一次允许匹配输入字符串,则模式匹配。

!(pattern-list) 如果输入字符串不能与模式列表中的任何模式匹配,则模式匹配。