我只能匹配简单的模式,如:" [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的任何字符串。 我需要在我的程序中匹配这样的东西(这是为了大学考试,所以模式非常错综复杂)
答案 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)
如果输入字符串不能与模式列表中的任何模式匹配,则模式匹配。