fnmatch和GNU C Library中的模式匹配

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

有时候需要一些简单的模式匹配正则有点杀鸡用牛刀的意思可以考虑The GNU C Library提供的fnmatch函数。

#include <fnmatch.h>
int fnmatch(const char *pattern, const char *string, int flags);

fnmatch用来检查string是否匹配pattern所表示的模式其使用shell通配符模式具体规则参见man 7 glob主要规则有

?不在中括号内的匹配单个字符
*不在中括号内的匹配一个字符串包括空字符串
对于一个路径匹配分别应用于其被/分隔的各个部分/不会被?*匹配到
.开头的文件必须显式匹配例如rm *并不会删除.profile
[...]第一个字符不是!匹配被中括号包围的任一字符括号间不可为空例如[][!]匹配][!
中括号内可以使用range例如[1-5]匹配1,2,3,4,5如果要匹配-要把-放到括号中的最前或最后位置。[--0]匹配-.0/不会被匹配因为它是目录分隔符
如果中括号内首字符是!表示其中字符不会被匹配到

关于参数flag
FNM_NOESCAPE 将反斜杠视为普通字符
FNM_FILE_NAME或FNM_PATHNAME *?[]中的/不匹配字符串中的/只能显式指定/比如

fnmatch("*", "a/b", FNM_PATHNAME) 不匹配
fnmatch("*", "a/b", 0) 匹配

FNM_PERIOD 模式不能匹配.开头的字符串除非显式指定如果同时设置了FNM_PATHNAME上述特殊处理还适用于字符串中/之后的.开头的子串比如

fnmatch("*", ".b", FNM_PERIOD) 不匹配
fnmatch(".*", ".b", FNM_PERIOD) 匹配
fnmatch("*/*", "a/.b", FNM_PATHNAME|FNM_PERIOD) 不匹配

FNM_CASEFOLD 忽略大小写

关于返回值
如果匹配成功返回0如果没有匹配返回FNM_NOMATCH如果有错误返回其他非零值。

其他模式匹配方法
glob用于寻找当前目录下符合模式的pathnames声明为int glob(const char *pattern, int flags, int (*errfunc) (const char *epath, int eerrno), glob_t *pglob);
No tilde expansion or parameter substitution is done; if you want these, use wordexp。wordexp的声明为int wordexp(const char *s, wordexp_t *p, int flags);
fnmatch、glob、wordexp都是GNU C Library第10章模式匹配中的一部分该章还包括正则表达式匹配详细参见 Pattern Matching

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6