C regex验证文件夹下的文件名

C regex验证文件夹下的文件名,c,regex,filenames,C,Regex,Filenames,我不熟悉C中的正则表达式,我正在尝试使用regex.hlibrary查找给定文件名是否位于使用regex的文件夹下。这就是我尝试过的: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <regex.h> int checkregex(char regex_str[100], char test[100]) { regex_t regex; pr

我不熟悉C中的正则表达式,我正在尝试使用
regex.h
library查找给定文件名是否位于使用regex的文件夹下。这就是我尝试过的:

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

int checkregex(char regex_str[100], char test[100]) {
    regex_t regex;
    printf("regex_str: %s\n\n", regex_str);
    int reti = regcomp(&regex, regex_str, REG_EXTENDED | REG_ICASE);
    if (reti) {
        fprintf(stderr, "Could not compile regex\n");
        exit(1);
    }
    reti = regexec(&regex, test, 0, NULL, REG_EXTENDED | REG_ICASE);
    regfree(&regex);
    return reti;
}

void main(int argc, char *argv[]) {
    const char *safepath = "/home";
    size_t spl = strlen(safepath);

    char *fn = argv[1];

    int noDoubleDots = checkregex("[^..\\/]", fn);
    int allowedChars = checkregex("^[[:alnum:]\\/._ -]*$", fn);
    int backslashWithSpace = checkregex(".*(\\ ).*", fn);

    puts("noDoubleDots");
    puts((noDoubleDots == 0 ? "Match\n" : "No Match\n"));
    puts("allowedChars");
    puts((allowedChars == 0 ? "Match\n" : "No Match\n"));
    puts("backslashWithSpace");
    puts((backslashWithSpace == 0 ? "Match\n" : "No Match\n"));

    return;
}
#包括
#包括
#包括
#包括
int checkregex(char regex_str[100],char test[100]){
regex_t regex;
printf(“regex\u str:%s\n\n”,regex\u str);
int-reti=regcomp(®ex,regex_str,REG_EXTENDED | REG_ICASE);
如果(reti){
fprintf(stderr,“无法编译正则表达式”);
出口(1);
}
reti=regexec(®ex,test,0,NULL,REG_EXTENDED | REG_ICASE);
regfree(®ex);
返回视网膜;
}
void main(int argc,char*argv[]){
const char*safepath=“/home”;
大小\u t spl=strlen(安全路径);
char*fn=argv[1];
int noDoubleDots=checkregex(“[^..\\/]”,fn);
int allowedChars=checkregex(“^[:alnum:\\/.\u-]*$”,fn);
int backslashWithSpace=checkregex(“.*(\\).*”,fn);
看跌期权(“noDoubleDots”);
puts((noDoubleDots==0?“匹配”\n:“不匹配”\n”);
看跌期权(“被允许的看跌期权”);
puts((allowedChars==0?“匹配”\n:“不匹配”\n”);
放置(“带空格的反斜杠”);
放置((反斜杠Withspace==0?“匹配”\n:“不匹配”\n”);
返回;
}
我的第一次尝试是,如果它包含
(我甚至无法做到)与
noDubleDots
不匹配。但后来我测试了一下,发现文件名和文件夹名中可以有
,比如
文件夹..name/
。所以我想排除那些带有
/..
的。但是,如果文件夹名称类似于
folder..
,并且其中有另一个名为
folder2/
的文件夹,则路径将是
folder\../folder2
,并且排除
。/
将导致错误的输出

在代码中,allowedChars可以正常工作。我想如果我还检查了文件名是否有正确的
\..
\([:alnum:])*
来验证文件路径,就可以完成了。但我的正则表达式似乎不起作用。例如,反斜杠与
asd/
asd\/
匹配


如何使用正则表达式检查并确保给定路径位于文件夹下?提前感谢。

POSIX提供了一个很好的功能

realpath()展开所有符号链接并解析对/、的引用, /../和名为的以null结尾的字符串中的额外“/”字符 生成规范化绝对路径名的路径。结果 路径名存储为以null结尾的字符串,最大值为 PATH_最大字节,在解析的_路径指向的缓冲区中。这个 结果路径将没有符号链接、//或//组件


如果你能使用它,我认为它会满足你的需要,如果不能,也许你可以复制源代码。

我不明白你想做什么,或者为什么你认为正则表达式是一个好的解决方案。您将如何处理符号链接?基本上,我试图确保程序的路径名位于主目录下。关于包含
和空格的名称,我有一些问题,所以我试图解释它们。我认为路径名中有一些模式可以匹配,所以也许我可以使用正则表达式来查找这些模式。我现在也可以忽略符号链接。如果(!strstrstr(fn,“/”)
,这不就是
吗?“一些问题”是什么意思?我已经创建了一个名为
folder..
的文件夹。这不会引起任何问题吗?让我困惑的是,我应该如何处理带有空格和
的路径名。您的正则表达式看起来有点错误。首先,backslashWithSpace可能应该转义反斜杠,即“\\\\”。而且noDoubleDots似乎与“/”中没有的字符匹配。谢谢你的回答,这很有帮助。但是当我有一个名为
folder..
的文件夹,并且在该文件夹中
folder2..
时,我可以得到第一个文件夹的实际路径,但不能得到第二个文件夹的路径。有什么解决办法吗?@MustafaSüve很抱歉,我不理解你的示例。我创建了一个名为
folder..
的文件夹,文件夹的名称后跟一个空格和两个点。然后在该文件夹中,我创建了另一个名为
folder2..
的文件夹,名称为folder2,后跟一个空格和两个点。我将路径
文件夹\../folder2\..
发送到realpath函数,它只给我
文件夹\..
。它在其他正常情况下也能正常工作。@MustafaSüve当我使用我的代码打印fn
fn=/folder\../folder2\../code>时,我无法复制您的错误。