C++ 使用std::regex_搜索与模式匹配的所有文件和文件夹
我想要实现搜索窗口,我使用:C++ 使用std::regex_搜索与模式匹配的所有文件和文件夹,c++,regex,C++,Regex,我想要实现搜索窗口,我使用: int main() { Search(L"C:\\Users", L"*.txt"); // or Search(L"C:\\Users", L"*.txt"); } search(path, CString searchString) { std::wregex searchPattern = GetPattern(searchString); result = RecursiveSearch(path, searchPattern); return
int main()
{
Search(L"C:\\Users", L"*.txt"); // or Search(L"C:\\Users", L"*.txt");
}
search(path, CString searchString)
{
std::wregex searchPattern = GetPattern(searchString);
result = RecursiveSearch(path, searchPattern);
return result ;
}
RecursiveSearch(path, std::wregex searchPattern)
{
CString newPath = path + CString("\\*");
WIN32_FIND_DATA findData;
HANDLE fileHandle = INVALID_HANDLE_VALUE;
fileHandle = FindFirstFile(newPath, &findData);
do
{
if (INVALID_HANDLE_VALUE != fileHandle)
{
if (std::regex_search(findData.cFileName, searchPattern))
{
if (findData.cFileName != std::wstring(TEXT(".")) && findData.cFileName != std::wstring(TEXT("..")))
{
std::wcout << (const wchar_t*)findData.cFileName
}
}
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (findData.cFileName != std::wstring(TEXT(".")) && findData.cFileName != std::wstring(TEXT("..")))
{
RecursiveSearch(GenerateNewPath(path, ToCString(findData.cFileName)), searchPattern);
}
}
}
else
{
continue;
}
} while (FindNextFile(fileHandle, &findData));
return allObject;
}
intmain()
{
搜索(L“C:\\Users”,L“*.txt”);//或搜索(L“C:\\Users,L“*.txt”);
}
搜索(路径,CString searchString)
{
std::wregex searchPattern=GetPattern(searchString);
结果=递归搜索(路径、搜索模式);
返回结果;
}
递归搜索(路径,std::wregex searchPattern)
{
CString newPath=path+CString(\\*);
WIN32_FIND_DATA findData;
句柄文件句柄=无效的句柄值;
fileHandle=FindFirstFile(newPath和findData);
做
{
if(无效的\u句柄\u值!=文件句柄)
{
if(std::regex_search(findData.cFileName,searchPattern))
{
if(findData.cFileName!=std::wstring(TEXT(“.”)和&findData.cFileName!=std::wstring(TEXT(“…”))
{
模式添加标志的标准::wcout:
std::regex_constants::icase | std::regex_constants::ECMAScript | std::regex_constants::optimize;
并向regex_搜索函数添加标志:
std::regex_constants::match_continuous
将$添加到模式的结尾尝试添加$(字符串的结尾)将regexTry的结尾添加为匹配模式。
如果希望它与点而不是任何字符完全匹配,则需要转义。L“*.txt”
被接受为有效模式?在这种情况下,*
量词实际上量化了什么?那么程序中最有趣的部分是GetPattern
的实现。奇怪的是,这正是您忽略显示的部分。文件名表达式不是正则表达式。嗯,从某种意义上讲,不是通常的正则表达式语法告诉你它们是如何工作的。它们有自己的规则集,正则表达式包不应用这些规则。“*.txt”作为文件名表达式是有效的,但它不是有效的正则表达式。