-2
我試圖使用正則表達式來驗證文件名。 試過這個字符串regcomp()失敗,'成功'
"^(?!(?:CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(?:\.[^.]*)?$)[^<>:\"/\\\|\\?*\x00-\x1F]*[^<>:\"/\\\|\?*\x00-\x1F\\ .]$"
在網上檢查:https://www.freeformatter.com/regex-tester.html 作品如預期的 'video-'
- >完全處於源字符串相匹配!
但是,使用:
bool regexCompile(regex_t ®ex, const char *pattern)
{
int res = 0;
res = regcomp(®ex, pattern, REG_EXTENDED);
printf("res = %d\n",res);
if(res) // regex compiled unsuccessfully
{
int rc;
char buffer[100];
regerror(rc, ®ex, buffer, 100);
printf("regcomp() failed with '%s'\n", buffer);
return false;
}
return true;
}
bool isValidFileName(const char *fileName)
{
regex_t regex;
int res = 0;
// regex not complete
const char* pattern = "^(?!(?:CON|PRN|AUX|NUL|COM[1-9]|LPT[1-9])(?:\\.[^.]*)?$)[^<>:\"/\\\\|?*\x00-\x1F]*[^<>:\"/\\\\|\\?*\x00-\x1F\\ .]$";
if(regexCompile(regex, pattern) != true)
{
return false;
}
res = regexec(®ex, fileName, 0, NULL, 0);
if(!res)
{
return true;
}
return false;
}
我得到的文件名 「video-」:
res = 13
regcomp() failed with 'Success'
0
任何額外的反斜槓需要在C-正則表達式版本添加? 謝謝。
告訴你的代碼是不是C,它可能是C++(在這種情況下,你應該使用[C++標準的正則表達式的功能( http://en.cppreference.com/w/cpp/regex))。 –
什麼是'regexCompile(regex_t&regex ...'?除了「不是C代碼」? –
請注意POSIX [正則表達式](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html) ,即使是ERE變體,也不處理PCRE'(?...)'符號,因此,您需要[PCRE](https://pcre.org/)。因此,即使您解決了其他問題,正則表達式可能不符合你的期望 –